我正在使用passport-jwt
,我的策略设置如下:
let jwtOptions = {}
jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken()
jwtOptions.secretOrKey = process.env.SECRET
var strategy = new JwtStrategy(jwtOptions, function (jwt_payload, next) {
console.log('payload received', jwt_payload);
// usually this would be a database call:
var user = users[_.findIndex(users, { id: jwt_payload.id })];
if (user) {
next(null, user);
} else {
next(null, false);
}
})
passport.use(strategy)
因此,当我发布到/login
路由时,我可以生成令牌:
var payload = { id: user.id }
var token = jwt.sign(payload, jwtOptions.secretOrKey)
res.json({ message: "ok", token: token })
但是当我尝试拥有一个需要令牌的路线时:
app.get("/secret", passport.authenticate('jwt', { session: false }), (req, res) => {
res.json("Success! You can not see this without a token");
})
我的标题有Authorization: JWT [token]
它会不断返回401
。我做错了什么?
答案 0 :(得分:2)
您的授权标头格式不正确。根据{{3}}
fromAuthHeaderAsBearerToken()
创建一个新的提取器,在授权标题中查找JWT并使用方案' bearer'
因此,您的标题应为Authorization: Bearer [token]
答案 1 :(得分:2)
如果您要在标头中发送令牌并使用自己的方案(在您的情况下,您使用的是“ JWT”),则可以使用fromAuthHeaderWithScheme(auth_scheme)方法。
您可以在passport-jwt文档中找到更多详细信息: