MEAN стек: Авторизация с Passport.js

Passport.js: Безопасная авторизация пользователей

Passport.js — библиотека, упрощающая авторизацию пользователей и повышающая безопасность приложения, предотвращая взлом и несанкционированный доступ. Для работы необходимо выбрать стратегию авторизации на официальном сайте (ссылка в описании). Существует множество стратегий, включая Facebook, Google и другие сервисы. В этом уроке используется passport-local для создания собственной системы авторизации. Предполагается, что библиотеки passport и passport-local уже установлены (проверьте package.json).

Конфигурация Passport.js

Создайте файл passport.js в папке config. Подключите необходимые модули: db.js (из той же директории) и ./models/user.js (модель пользователя).

const db = require('./db');
const User = require('../models/user');

Далее, приведён код, адаптированный из официальной документации Passport.js, который экспортирует функцию авторизации:

module.exports = function(passport) {
  passport.use(new LocalStrategy({
      usernameField: 'email',
      passwordField: 'password'
    },
    function(email, password, done) {
      User.findOne({ email: email }, function (err, user) {
        if (err) { return done(err); }
        if (!user) { return done(null, false); }
        if (!user.validPassword(password)) { return done(null, false); }
        return done(null, user);
      });
    }
  ));
  passport.serializeUser(function(user, done) {
    done(null, user.id);
  });
  passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
      done(err, user);
    });
  });
};

Описание кода:

  • Создаётся объект опций для авторизации типа local.
  • Указываются поля email и password для проверки.
  • Стратегия LocalStrategy используется для проверки учетных данных.
  • findOne ищет пользователя по email в базе данных.
  • validPassword сравнивает введённый пароль с хэшированным паролем из базы данных.
  • serializeUser и deserializeUser сериализуют и десериализуют пользователя для сессий.

Инициализация Passport.js и сессий в app.js

В файле app.js добавьте:

app.use(passport.initialize());
app.use(passport.session());
require('./config/passport')(passport);

Защита маршрутов и авторизация

Для защиты маршрутов используется middleware passport.authenticate:

router.get('/dashboard', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));

Этот код запрещает доступ к /dashboard неавторизованным пользователям.

Маршрут для авторизации:

router.post('/login',
  passport.authenticate('local', {
    successRedirect: '/dashboard',
    failureRedirect: '/login',
    failureFlash: true
  })
);

Этот код обрабатывает POST-запрос на /login, проверяет учетные данные с помощью passport.authenticate и перенаправляет на /dashboard при успехе или на /login с сообщением об ошибке при неудаче.

Обработка данных авторизации (логин и пароль) происходит через req.body:

let login = req.body.login;
let password = req.body.password;

Далее, предполагается поиск пользователя в базе данных и сравнение паролей с помощью функции comparePassword в модели user.js. (Функция использует bcrypt.compare). В примере отсутствует генерация JWT токена, но упоминается, что для успешной авторизации можно генерировать JWT токен с использованием библиотеки jsonwebtoken, включая информацию о пользователе и время истечения (например, 24 часа). Ответ сервера может содержать флаг success, JWT токен и информацию о пользователе.

В этом уроке реализована авторизация пользователей в приложении MEAN с помощью Passport.js. В следующих уроках будет создан полноценный интерфейс авторизации с HTML-файлами.

Что будем искать? Например,программа