如何使用 passport-jwt 验证路由?
Posted
技术标签:
【中文标题】如何使用 passport-jwt 验证路由?【英文标题】:How to authenticate a route with passport-jwt? 【发布时间】:2018-05-19 08:25:16 【问题描述】:我正在使用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
。我做错了什么?
【问题讨论】:
你不在这里展示它,你有没有用你的 JwtStrategy 实例调用passport.use(strategy)
?
另外,展示您如何格式化您在GET /secret
请求中发送的标头
@Paul - 已更新。我正在使用passport.use(strategy)
和标题
【参考方案1】:
如果您在标头中发送令牌并使用自己的方案(在您的情况下使用 "JWT" ),您可以使用 fromAuthHeaderWithScheme(auth_scheme) 方法。
您可以在 passport-jwt 文档中找到更多详细信息:
fromAuthHeaderWithScheme(auth_scheme) 创建一个新的提取器,用于在授权标头中查找 JWT,期望方案与 auth_scheme 匹配。 fromAuthHeaderAsBearerToken() 创建一个新的提取器,该提取器使用方案“承载”在授权标头中查找 JWThttps://www.npmjs.com/package/passport-jwt
【讨论】:
【参考方案2】:您的授权标头格式不正确。根据jwt-strategy docs
fromAuthHeaderAsBearerToken()
创建一个新的提取器,该提取器在授权标头中使用方案“承载”查找 JWT
所以你的标题应该是Authorization: Bearer [token]
【讨论】:
以上是关于如何使用 passport-jwt 验证路由?的主要内容,如果未能解决你的问题,请参考以下文章
使用 passport-jwt 进行 JWT 身份验证不考虑到期日期