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-файлами.