护照本地与node-jwt-simple

我怎样才能结合passport本地返回一个成功的身份validationJWT令牌?

我想使用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,你需要提供你的validation逻辑。 例如,我们来使用passport-local中的那个。

 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); }); } )); 

validationcallback你提供的function(username, password, done)将负责find你的用户,并检查密码是否匹配(超出了问题的范围和我的答案)

passport.js期望它能够工作的几个部分,一个是你在策略中返回用户。 我试图改变那部分代码,那是错误的。 如果validation失败,则callback期望为false如果成功,callback期望为object (validation的用户)。

现在….如何整合智威汤逊?

在您的login路线中,您将不得不处理一个成功的身份validation或不成功的身份validation。 在这里,您需要添加JWT令牌创build。 像这样:

(记住要禁用会话,否则你将不得不实现序列化和反序列化函数。如果你没有保持会话,你不需要那些会话,如果你使用的是基于令牌的授权,那么你不需要这些)

从护照本地示例:(添加了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)上面的第一个代码片段将尝试根据您提供的用户名find一个用户,然后检查密码匹配(当然,您将需要改变,以满足您的需求)。

之后,您的login路线将被调用,在那里你可以照顾返回一个错误或一个有效的令牌。

希望这会帮助别人。 如果我犯了错误或忘记了一些事情,请告诉我。

这是一个很好的解决scheme,我只是想补充一点:

 var expressJwt = require('express-jwt'); app.use('/api', expressJwt({secret: secret})); 

我喜欢用“express-jwt”来validation令牌。

顺便说一句:这篇文章是很好的学习如何处理在客户端的令牌,使用Angular,以发送回每个请求

https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

这里有一个锅炉板,我正在专门使用api令牌(没有会话……当然不是会话是坏的,只是我们使用令牌方法): https : //github.com/roblevintennis/passport -API的令牌