Паспорт-локальный с node -jwt-simple

Как мне совместить паспорт-локальный, чтобы вернуть токен JWT при успешной аутентификации?

Я хочу использовать node-jwt-simple и смотреть passport.js Я не уверен, как это сделать.

var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function(err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

Можно ли вернуть токен при вызове done()? Что-то вроде этого... (просто псевдокод)

if(User.validCredentials(username, password)) {
  var token = jwt.encode({username: username}, tokenSecret);
  done(null, {token : token}); //is this possible?
}

Если нет, как я могу вернуть токен?

Ответ 1

Я понял это!

Прежде всего, вам нужно реализовать правильную стратегию. В моем случае LocalStrategy, и вам нужно предоставить логику проверки. Например, саке можно использовать один в паспорт-местном.

var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function(err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

подтверждение возврата, которое вы предоставляете function(username, password, done), позаботится о поиске вашего пользователя и проверке соответствия пароля (вне сферы действия вопроса и моего ответа)

passport.js ожидает, что несколько штук для него будут работать, во-первых, вы вернете пользователя в стратегии. Я пытался изменить эту часть кода, и это было неправильно. Обратный вызов ожидает false, если проверка завершена, и object (проверенный пользователь), если вы успешны.

Теперь... как интегрировать JWT?

В вашем логин-маршруте вам придется обрабатывать успешный авторизационный или неудачный. И именно здесь вам нужно добавить создание токена JWT. Например:

(не забудьте отключить сеанс, в противном случае вам придется реализовать функции сериализации и десериализации. И вам не нужны эти, если вы не сохраняете сеанс, а вы нет, если используете аутентификацию на основе токенов)

Из паспортных локальных примеров: (с добавленным токеном JWT)

// POST /login
//   This is an alternative implementation that uses a custom callback to
//   achieve the same functionality.
app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err) }
    if (!user) {
      return res.json(401, { error: 'message' });
    }

    //user has authenticated correctly thus we create a JWT token 
    var token = jwt.encode({ username: 'somedata'}, tokenSecret);
    res.json({ token : token });

  })(req, res, next);
});

И это все! Теперь, когда вы вызываете/авторизуетесь и POST-имя пользователя и пароль (который всегда должен быть за SSL), первый фрагмент кода выше попытается найти пользователя на основе вашего имени пользователя, а затем проверить, соответствует ли пароль (конечно, вам нужно будет измените это в соответствии с вашими потребностями).

После этого будет вызываться ваш логин, и вы можете позаботиться о возврате ошибки или действительного токена.

Надеюсь, это поможет кому-то. И если я допустил какие-либо ошибки или забыл что-то, дайте мне знать.

Ответ 2

Это отличное решение, я просто хочу добавить это:

var expressJwt = require('express-jwt');

app.use('/api', expressJwt({secret: secret}));

Мне нравится использовать "express-jwt" , чтобы проверить токен.

btw: в этой статье вы узнаете, как обрабатывать токен на стороне клиента, используя Angular, чтобы отправить его обратно с каждым запросом

https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

Ответ 3

Здесь котельная плита, над которой я работаю, специально для использования токенов api (нет сеансов... не такая сессия, конечно, плохая, просто мы используем подход к токенам): https://github.com/roblevintennis/passport-api-tokens