【发布时间】:2016-06-02 09:18:51
【问题描述】:
我正在尝试使用 passport-jwt 设置 JWT 身份验证。我认为我采取了正确的步骤,但测试 GET 不会成功,我不知道如何调试它。
这是我所做的:
-
尽可能设置passport-jwt straight out of the doc
var jwtOptions = { secretOrKey: 'secret', issuer: "accounts.examplesoft.com", // wasn't sure what this was, so i left as defaulted in the doc audience: "yoursite.net" // wasn't sure what this was, so i left as defaulted in the doc }; jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeader(); passport.use(new JwtStrategy(jwtOptions, function(jwt_payload, done) { User.findOne({id: jwt_payload.sub}, function(err, user) { if (err) { return done(err, false); } if (user) { done(null, user); } else { done(null, false); // or you could create a new account } }); })); -
向我的用户 /login 端点添加了令牌结果
var jwt = require('jsonwebtoken'); // ... exports.postLogin = function(req, res, next) { passport.authenticate('local', function(err, user, info) { if (err) throw err; if (!user) { return res.send({ msg: 'Login incorrect' }); } req.logIn(user, function(err) { if (err) throw err; var secretOrKey = jwtOptions.secretOrKey; var token = jwt.sign(user, secretOrKey, { expiresIn: 631139040 // 20 years in seconds }); res.send({ user: user, jwtToken: "JWT " + token }); }); })(req, res, next); };
到目前为止,一切看起来都不错。我可以登录用户(使用护照本地身份验证)并且响应是我希望的......
{ “用户”:{ "_id": "56c8b5bd80d16ef41ec705dd", “电子邮件”:“peachy@keen.com”, "密码": "$2a$10$zd ...等", “__v”:0, }, "jwtToken": "JWT eyJ0eXAiOiJ .... 等" }
我像这样创建了一个不受保护的测试路线......
// in my routes file
app.get('/user/tokenTest', user.tokenTest);
在我的控制器中,一个简单的端点...
exports.tokenTest = function(req, res) {
console.log(req.headers);
res.send("token test!!");
};
而且 GET 也可以正常工作。
-
然后我尝试像这样保护那条路线:
app.get('/user/tokenTest', passport.authenticate('jwt', { session: false }), user.tokenTest);
在我这样做之后,除了悲伤什么都没有。我发送这样的请求:
curl -k 'https://localhost:3443/user/tokenTest' -H 'Authorization: JWT eyJ0eXAiOiJ... etc.'
总是,总是得到 401:
未经授权
控制器中的控制台日志似乎没有执行,passport.use 策略方法中的日志也没有。我已经调整和调整,但我有点迷失了。 passport-jwt 文档仅提供示例,几乎没有其他帮助。
请对我在上面犯的错误或至少如何进行调试有任何想法?
【问题讨论】:
-
你对
app.get路由做了什么?你说你保护了app.post路由,但是你的 curl 使用了GET方法。 -
@bolav - 不错。谢谢。我错误地将其保护为邮政路线。将其更改为获取(请参阅编辑),我仍然遇到基本相同的问题(请参阅更新的错误)。
-
@user1272965 我正在做一个类似的项目,你能告诉我你如何在客户端存储 jwt 吗?因为我们每次调用 API 时都需要在头部中使用它,所以你是如何将它存储在客户端的?
标签: javascript node.js passport.js