如何使用 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() 创建一个新的提取器,该提取器使用方案“承载”在授权标头中查找 JWT

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于如何使用 passport-jwt 验证路由?的主要内容,如果未能解决你的问题,请参考以下文章

设置 passport-jwt 身份验证

使用 passport-jwt 验证节点 API

我可以有条件地使用passport-jwt吗?

使用 passport-jwt 进行 JWT 身份验证不考虑到期日期

使用passport-jwt在nestJs框架中进行角色验证

如何使用 passport-jwt 正确检查令牌有效负载?