如何结合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?
}
如果没有,我如何退还代币?
我想通了!
首先,你需要实施正确的策略。在我的案例中是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