passport-local with node-jwt-simple
如何在成功进行身份验证时结合本地护照以返回JWT令牌?
我想使用node-jwt-simple并查看passport.js,我不确定该怎么做。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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()时是否可以返回令牌?
像这样...(只是伪代码)
1 2 3 4 | if(User.validCredentials(username, password)) { var token = jwt.encode({username: username}, tokenSecret); done(null, {token : token}); //is this possible? } |
如果没有,我该如何退还令牌?
我想到了!
首先,您需要实施正确的策略。就我而言,是LocalStrategy,您需要提供验证逻辑。例如,为了方便起见,让我们在本地护照中使用它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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); }); } )); |
您提供的
Passport.js希望它能起作用,其中之一是您在策略中回馈用户。我试图更改代码的那部分,那是错误的。如果验证失败,则回调函数期望
现在...如何整合JWT?
在您的登录路径中,您将必须处理成功的身份验证或不成功的身份验证。您需要在此处添加JWT令牌创建。像这样:
(请记住禁用会话,否则,您将必须实现序列化和反序列化功能。如果您不持久化会话,则不需要那些,如果您使用的是基于令牌的身份验证,则不需要这些)
来自本地护照示例:(添加了JWT令牌)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 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)时,上面的第一个代码段将尝试根据您提供的用户名查找用户,然后检查密码是否匹配(当然,您需要根据您的需要进行更改)。
之后,您的登录路由将被调用,在那里您可以照顾到返回错误或有效令牌。
希望这会帮助某人。如果我犯了任何错误或忘记了什么,请告诉我。
这是一个很好的解决方案,我只想添加以下内容:
1 2 3 | 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