Ответ 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), первый фрагмент кода выше попытается найти пользователя на основе вашего имени пользователя, а затем проверить, соответствует ли пароль (конечно, вам нужно будет измените это в соответствии с вашими потребностями).
После этого будет вызываться ваш логин, и вы можете позаботиться о возврате ошибки или действительного токена.
Надеюсь, это поможет кому-то. И если я допустил какие-либо ошибки или забыл что-то, дайте мне знать.