我正在尝试让JWT与passport.js一起使用,我有一个本地策略可以注册,另一个可以登录用户。目前,我通过执行以下操作来返回令牌:
req.login(user, {session: false}, (err) => {
if (err) {
res.send(err);
}
var jwtUser = {
_id: user.id,
email: user.email
};
const token = jwt.sign(jwtUser, config.passport.jwtSecret);
return res.json({jwtUser, token});
});
这将返回一个对象,例如:
{"jwtUser":
{
"_id":"5c55f0be9ddcf71a704d92b2",
"email":"john.doe@example.com"
},
"token":"<token>" // redacted this because it contains my personal email
}
因此,我得到的令牌是正确的(我已经使用在线解码器进行了检查,它提供了正确的用户ID和正确的电子邮件)。
当我使用此路由尝试测试JWT策略是否有效时,我收到401未经授权的访问消息。
这是我的JWT策略
var opts = {};
opts.jwtFromRequest = ExtractJWT.fromAuthHeaderAsBearerToken();
opts.secretOrKey = config.passport.jwtSecret;
passport.use('jwt', new JWTstrategy(opts, function(jwt_payload, done) {
console.log('payload received: ', jwt_payload);
User.findOne({id: jwt_payload.id}, function(err, user) {
console.log('User: ', user);
if (user) {
console.log(user);
return done(null, user);
}
if (err) {
return done(err, false);
}
});
}));
我的路线
router.get('/auth/test', passport.authenticate('jwt', { session: false }), (req, res) => {
res.send('You reached a private route.');
});
我使用与拨打护照相同的方法来制定本地策略。
我认为我已经包含了所有有价值的东西,如果缺少某些内容,请说出来,我将用它来更新操作规范。
谢谢!
编辑**
我应该注意,我正在使用邮递员进行测试并使用不记名令牌的授权方法。