node.js试图让护照和ExtraxtJwt工作

时间:2017-12-15 13:19:30

标签: node.js express authentication jwt passport.js

我试图成功授权在node.js中使用jwt和passport。 我使用的是带有JwtStrategy的passport.use。

我已设置在我的某条路线上开启身份验证,以测试它是否会在没有令牌的情况下取消授权,

id

当我向邮递员发送邮件请求到http://localhost:3000/users/profile时,我得到// Profile router.get('/profile', passport.authenticate('jwt', { session: false }), (req, res, next) => { res.json({ user: req.user }); }); 到目前为止很好......

当我通过localhost:3000 / users / authenticate使用正确的用户名和密码登录邮递员时,我会收到一个令牌。看起来像这样:

Unauthorized

我试图像这样抓住那个令牌:

{
"success":true,
"token":"JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7Il9pZCI6IjVhMzNiMzE1NDFlYWU1MDk2MDRhNTE0ZiIsIm5hbWUiOiJyYXMiLCJlbWFpbCI6InJhc0BwLmQiLCJ1c2VybmFtZSI6InJwdWxzIiwicGFzc3dvcmQiOiIkMmEkMTAkTFR5eS50TmdualB2a0htWXNuUkV0TzRwWEVEL0gycDJCYWRDRlVXMUtWaXI5TnltSUtnVUciLCJfX3YiOjB9LCJpYXQiOjE1MTMzNDI1MjksImV4cCI6MTUxMzk0NzMyOX0.amCkcFWtPwf_HYUxpXOPvcRShksH9fw7O4vVOsBm4yA",
"user":{
"id":"5a33b31541eae509604a514f",
"name":"n",
"username":"testUser",
"email":"bla@bla"}
}

并将其添加为JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7Il9pZCI6IjVhMzNiMzE1NDFlYWU1MDk2MDRhNTE0ZiIsIm5hbWUiOiJyYXMiLCJlbWFpbCI6InJhc0BwLmQiLCJ1c2VybmFtZSI6InJwdWxzIiwicGFzc3dvcmQiOiIkMmEkMTAkTFR5eS50TmdualB2a0htWXNuUkV0TzRwWEVEL0gycDJCYWRDRlVXMUtWaXI5TnltSUtnVUciLCJfX3YiOjB9LCJpYXQiOjE1MTMzNDI1MjksImV4cCI6MTUxMzk0NzMyOX0.amCkcFWtPwf_HYUxpXOPvcRShksH9fw7O4vVOsBm4yA 标题,但我仍然得到Authorization .....这很难继续,因为我得到绝对没有错误消息。

这是我的护照代码:

Unauthorized
这是问题吗? const JwtStrategy = require('passport-jwt').Strategy; const ExtractJwt = require('passport-jwt').ExtractJwt; const User = require('../models/user'); const config = require('../config/database'); module.exports = function (passport) { let opts = {}; opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken(); opts.secretOrKey = config.secret; passport.use(new JwtStrategy(opts, (jwt_payload, done) => { User.getUserById(jwt_payload._id, (err, user) => { if (err) { return done(err, false); console.log(err); } if (user) { return done(null, user); } else { return done(null, false); } }); })); } 我也尝试使用ExtractJwt.fromAuthHeaderWithScheme(" jwt")代替,但结果相同。

这是我的身份验证代码(我猜这是因为我在登录时使用正确的用户/通行证取回了令牌)

opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();

也可能是我在发布GET请求时在post man中做错了什么? enter image description here

1 个答案:

答案 0 :(得分:0)

我真的希望这个工作,但似乎新版本的护照和护照-jwt文档很差,并且很难调试....

我卸载了两个模块并安装了express-jwt,默认情况下需要为所有路由提供令牌。为了允许我登录和注册路由,我只需要使用一行配置。

const expressJWT = require('express-jwt')
.
.
.
app.use(expressJWT({secret: secret}).unless({path : ['/api/authenticate', '/api/register']}))

我可以推荐这种解决方案来保护路线,因为它很容易设置和使用。然而,我不知道它与护照相比有多安全。