В этой статье мы рассмотрим, как начать использовать Node.js для создания программ.
Аутентификация
В реальном мире многие HTTP-запросы могут быть выполнены только после аутентификации пользователя. Это легко сделать в приложении Node.js.
Чтобы облегчить себе жизнь, мы используем веб-фреймворк Express для создания нашего HTTP-сервера вместо использования встроенного модуля http
.
Нам также нужны passport
и passport-local
, чтобы мы могли добавить аутентификацию, и пакет body-parser
для синтаксического анализа тел запросов.
Для установки всех пакетов запускаем:
npm install express body-parser passport passport-local
Затем мы можем написать следующий код, чтобы добавить аутентификацию с passport
:
const express = require('express'); const bodyParser = require('body-parser'); const Passport = require('passport'); const LocalStrategy = require('passport-local').Strategy; const users = { foo: { username: 'foo', password: 'bar', id: 1 }, bar: { username: 'bar', password: 'foo', id: 2 } } const localStrategy = new LocalStrategy({ usernameField: 'username', passwordField: 'password' }, function(username, password, done) { user = users[username]; if (user === undefined) { return done(null, false, { message: 'Invalid user' }); } if (user.password !== password) { return done(null, false, { message: 'Invalid password' }); } done(null, user); }) const app = express(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.use(express.static('public')); app.use(Passport.initialize()); Passport.use('local', localStrategy); app.get('/', (req, res) => { res.sendFile('public/index.html'); }); app.post( '/login', Passport.authenticate('local', { session: false }), function(request, response) { response.send('User Id ' + request.user.id); } ); app.listen(3000, () => console.log('server started'));
Нам нужны пакеты passport
и passport-local
.
Затем мы используем конструктор LocalStrategy
для создания нашего механизма аутентификации.
userField
и passwordField
установлены в свойствах объектов в объекте users
, так что мы можем получить свойства для имени пользователя и пароля.
Затем в функции, которую мы передали во второй аргумент LocalStrategy
, мы проверяем user
и проверяем пароль.
Функция done
вызывается, чтобы позволить нам вернуть желаемое ответное сообщение в зависимости от действительности имени пользователя или пароля.
Последний done
вызов выполняется, когда действительны и имя пользователя, и пароль.
Затем мы вызываем Passport.use
, чтобы создать 'local'
стратегию аутентификации, чтобы мы могли использовать приведенный выше код с функцией Passport.authenticate
.
Затем мы можем получить данные для аутентифицированного пользователя с помощью свойства request.user
.
Данные получены при звонках:
done(null, user);
Теперь, когда мы делаем POST-запрос к маршруту /login
с телом запроса:
{ "username": "foo", "password": "bar" }
Тогда получаем:
User Id 1
вернулся с сервера.
Если у нас есть комбинация имени пользователя и пароля, которой нет в объекте users
, мы получаем тело ответа Unauthorized
и код состояния 401.
Заключение
Чтобы упростить добавление аутентификации в наш код, мы можем использовать Passport, чтобы позволить нам добавить промежуточное программное обеспечение для упрощения базовой аутентификации.