如何用passport-jwt验证路由?

时间:2017-12-05 15:52:24

标签: node.js express jwt passport.js

我正在使用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。我做错了什么?

2 个答案:

答案 0 :(得分:2)

您的授权标头格式不正确。根据{{​​3}}

  

fromAuthHeaderAsBearerToken()创建一个新的提取器,在授权标题中查找JWT并使用方案' bearer'

因此,您的标题应为Authorization: Bearer [token]

答案 1 :(得分:2)

如果您要在标头中发送令牌并使用自己的方案(在您的情况下,您使用的是“ JWT”),则可以使用fromAuthHeaderWithScheme(auth_scheme)方法。

您可以在passport-jwt文档中找到更多详细信息:

  • fromAuthHeaderWithScheme(auth_scheme)创建一个新的提取器,该提取器在授权标头中查找JWT,期望该方案与auth_scheme匹配。
  • fromAuthHeaderAsBearerToken()创建一个新的提取器,该提取器使用方案“ bearer”在授权标头中查找JWT

https://www.npmjs.com/package/passport-jwt