Работали ли вы с Passport.js для аутентификации в Node.js?

Ответ

Да, использовал 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 он встраивается, как родной. Удобно, блядь, хоть и не без косяков, куда ж без них.