【问题标题】:How to authenticate a route with passport-jwt?如何使用 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) 和标题

标签: node.js express jwt passport.js


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您的授权标头格式不正确。根据jwt-strategy docs

    fromAuthHeaderAsBearerToken() 创建一个新的提取器,该提取器在授权标头中使用方案“承载”查找 JWT

    所以你的标题应该是Authorization: Bearer [token]

    【讨论】:

      猜你喜欢
      • 2016-06-02
      • 2017-01-29
      • 2020-07-03
      • 2020-11-18
      • 2019-03-28
      • 2018-07-05
      • 1970-01-01
      • 2017-05-13
      • 2016-01-02
      相关资源
      最近更新 更多