无法使用 passport-jwt 访问受保护的路线

Posted

技术标签:

【中文标题】无法使用 passport-jwt 访问受保护的路线【英文标题】:cannot access protected route with passport-jwt 【发布时间】:2019-08-23 01:18:37 【问题描述】:

我无法对秘密资源进行身份验证,我正在使用登录令牌进行调用,但我每次都得到未经授权的响应。

  passport.use(
  new JwtStrategy(
    
      jwtFromRequest: ExtractJwt.fromHeader("Authorization"),
      secretOrKey: jwtSecret
    ,
    async (payload, done) => 
      try 
        const user = await User.findById(payload.sub);
        console.log(payload.sub);
        if (!user) 
          return done(null, false);
        
        done(null, user);
       catch (error) 
        done(error, false);
      
    
  )
);

控制器/users.js:

const signToken = user => 
  return jwt.sign(
    
      iss: "nikname",
      iat: new Date().getTime(),
      sub: user._id,
      exp: new Date().setTime(new Date().getDate() + 1)
    ,
    jwtSecret
  );
;

路线:

router.route('/secret')
.get(passport.authenticate('jwt',session: false),usersController.secret);

由于错误不清楚,我无法找出问题所在。 有什么帮助吗? 非常感谢

【问题讨论】:

我尝试了其他提取器:fromAuthHeaderasBearerToken(),fromAuthHeaderWithScheme("jwt"),没有成功 console.log(payload.sub) 没有显示任何内容,就像它没有读取 jwtStrategy 【参考方案1】:

使用 jwt 调试器后,payload 似乎出现了问题,虽然调试器显示了经过验证的令牌符号,但 'exp' 和 'iat' 显示了错误的日期,所以我将 signToken 常量更改如下:

    const signToken = user => 
  return jwt.sign(
    
      iss: "nikname",
      sub: user.id,
    ,
    jwtSecret,
    
      expiresIn: '2d'
    
  );
;

经过研究,似乎 fromHeader (提取器)在 passport-jwt@4.0.0 中运行不佳,因此我改用 fromAuthHeaderWithScheme 。像这样:

jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('JWT'),

现在它工作得很好。

【讨论】:

以上是关于无法使用 passport-jwt 访问受保护的路线的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Node JS 中使用 JWT 访问受保护的路由

无法访问子类中的受保护方法[重复]

无法访问受保护的成员“object.MemberwiseClone()”

C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]

无法访问受保护的成员[重复]

我无法访问我的基类的受保护成员