В этой статье мы рассмотрим, как начать использовать 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, чтобы позволить нам добавить промежуточное программное обеспечение для упрощения базовой аутентификации.