Локальный паспорт с узлом-jwt-простым
Как я могу объединить passport-local для возврата токена 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?
}
Если нет, как я могу вернуть токен?
3 ответа
Я понял!
Прежде всего вам необходимо реализовать правильную стратегию. В моем случае 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);
});
И это все! Теперь, когда вы вызываете /login и имя пользователя и пароль POST (которые всегда должны быть поверх SSL), первый фрагмент кода выше попытается найти пользователя на основе предоставленного вами имени пользователя, а затем проверит, что пароль совпадает (конечно, вам потребуется изменить это в соответствии с вашими потребностями).
После этого будет вызван ваш маршрут входа в систему, и вы сможете позаботиться о возврате ошибки или действительного токена.
Надеюсь, это кому-нибудь поможет. И если я сделал какие-либо ошибки или забыл что-то, дайте мне знать.
Это отличное решение, я просто хочу добавить это:
var expressJwt = require('express-jwt');
app.use('/api', expressJwt({secret: secret}));
Мне нравится использовать "express-jwt" для проверки токена.
Кстати: эта статья полезна для изучения того, как обрабатывать токен на стороне клиента, используя Angular, чтобы отправлять его обратно при каждом запросе.
https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
Вот пример, над которым я работаю, чтобы специально использовать только токены api (без сессий... конечно, этот сеанс не плох; просто мы используем токен): https://github.com/roblevintennis/passport-api-tokens