паспорт-локальный с узлом-jwt-простой
Как я могу объединить passport-local для возврата токена JWT при успешной аутентификации?
Я хочу использовать node-jwt-simple и, глядя на паспорт.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)
позаботится о поиске вашего пользователя и проверке соответствия пароля (за пределами вопроса и моего ответа)паспорт.js ожидает, что несколько частей для него будут работать, один из них что вы возвращаете пользователя в стратегии. Я пытался изменить эту часть кода, и это было неправильно. Обратный вызов ожидает
false
если проверка не удается иobject
(проверенный пользователь) если вы успешны.сейчас.... как интегрировать вышлю?
в вашем маршруте входа вам придется обрабатывать успешную аутентификацию или неудачную. И именно здесь вам нужно добавить создание токена 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); });
и это все! Теперь при вызове /логин и имя пользователя и пароль (который всегда должен быть через 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