Ответ
Да, использовал Passport.js в нескольких проектах на Express. Это middleware для аутентификации, которое поддерживает множество стратегий через плагины.
Чаще всего применял:
- Local Strategy для аутентификации по логину/паролю
- JWT Strategy (passport-jwt) для stateless-аутентификации в REST API
- OAuth2 стратегии для интеграции с Google, GitHub
Пример настройки JWT стратегии:
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const opts = {
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: process.env.JWT_SECRET
};
passport.use(new JwtStrategy(opts, async (jwt_payload, done) => {
try {
const user = await User.findById(jwt_payload.sub);
if (user) {
return done(null, user);
}
return done(null, false);
} catch (err) {
return done(err, false);
}
}));
Защита роута:
app.get('/profile', passport.authenticate('jwt', { session: false }),
(req, res) => {
res.json({ user: req.user });
}
);
Основное преимущество Passport.js — единообразный интерфейс для разных стратегий аутентификации и хорошая интеграция с Express middleware.
Ответ 18+ 🔞
Да ты что, ёпта! Passport.js, этот старый добрый костыль, который я вгонял в проекты на Express, как последний распиздяй. Ну, middleware для аутентификации, если по-простому. Штука, которая умеет дружить с кучей разных способов залогиниться через всякие плагины-стратегии.
Чаще всего мои руки, блядь, нащупывали вот это:
- Local Strategy — классика жанра, логин-пароль, всё как у бабушки в деревне.
- JWT Strategy (этот passport-jwt) — для этих ваших модных REST API, где состояния нет, а вера в токены — овердохуища.
- OAuth2 стратегии — когда надо примазаться к Google или GitHub, как хитрая жопа.
Вот, смотри, как JWT настраивается, реальный пример:
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const opts = {
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: process.env.JWT_SECRET
};
passport.use(new JwtStrategy(opts, async (jwt_payload, done) => {
try {
const user = await User.findById(jwt_payload.sub);
if (user) {
return done(null, user);
}
return done(null, false);
} catch (err) {
return done(err, false);
}
}));
А вот как роут защитить, чтобы не всякий пидарас шерстяной зашёл:
app.get('/profile', passport.authenticate('jwt', { session: false }),
(req, res) => {
res.json({ user: req.user });
}
);
И главный плюс этой всей катавасии, чувак — один интерфейс на все случаи жизни. Не надо изобретать велосипед для каждой стратегии, и в Express он встраивается, как родной. Удобно, блядь, хоть и не без косяков, куда ж без них.