Я понял!
Прежде всего нужно реализовать правильную стратегию. В моем случае 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)
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' });
}
var token = jwt.encode({ username: 'somedata'}, tokenSecret);
res.json({ token : token });
})(req, res, next);
});
Вот и все! Теперь, когда вы вызываете / входите в систему и вводите имя пользователя и пароль 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/
источник
express-jwt
выполнял аутентификацию, но читал документацию по другим пакетам, напримерpassport-jwt
, думаю, я буду придерживатьсяexpress-jwt
. Гораздо проще, намного приятнее ИМОВот шаблон, над которым я работаю, специально для использования только токенов api (нет сеансов ... не этот сеанс, конечно, плох; просто мы используем подход с использованием токенов): https://github.com/roblevintennis/passport -api-токены
источник