Passport JWT 策略没有被调用

Posted

技术标签:

【中文标题】Passport JWT 策略没有被调用【英文标题】:Passport JWT Strategy not getting called 【发布时间】:2018-09-14 02:53:47 【问题描述】:

我正在尝试使用护照中间件授权我的 JWT 令牌,但没有调用策略回调函数。

在我的app.js 文件中,我指定我的/users 路由使用中间件,如下所示:

app.use('/users', passport.authenticate('jwt',  session: false ), users);

然后我有一个单独的文件 ./passport.js(我在 app.js 的顶部需要它),我在其中指定了我的护照策略:

passport.use(new JWTStrategy(
        jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
        secretOrKey   : 'jwt_secret_key'
    ,
    function (jwtPayload, cb) 
        console.log('jwtPayload', jwtPayload)
    
));

但我无法运行控制台日志。

我正在使用邮递员对此进行测试,并从授权选项中选择了Bearer Token。我可以看到这是在我的请求中添加一个标头。

当我在我的节点应用程序中记录我的请求对象时,我可以看到它看起来像这样:

headers:  
    authorization: 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YWM0YWI2ZTk1MWJiMjE1M2NhMjc0OWUiLCJmaXJzdF9uYW1lIjoiQW5kcmV3IiwibGFzdF9uYW1lIjoiTWNDYWxsdW0iLCJlbWFpbCI6ImFtY2NhbGx1bTg5QGdtYWlsLmNvbSIsImlhdCI6MTUyMjg0NzEyNSwiZXhwIjoxNTIyODUwNzI1fQ.WH12GJHMGrGsiJNIwUG2Dx_a9cZKjw7_SW8FYlEvLmk',
    accept: '*/*',
    host: 'localhost:3037',
,

所以中间件应该检测承载令牌并调用中间件?

任何帮助将不胜感激

【问题讨论】:

所以......假设你在某处得到了app.use(passport.initialize())的线路? 不,我没有。我刚刚开始工作。看起来我的策略中的secretOrKey 与我创建令牌的secretOrKey 不匹配。不知道为什么它会默默地失败,但看起来这是导致问题的原因,因为它现在正在工作。 hmm 我一直觉得passport.initialize() 是使用带护照的 Express 时的要求。 你有一个如何/在哪里使用它的例子吗?也许我在不知不觉中错过了一些东西 它仍在docs 中,请参阅middleware 部分。 【参考方案1】:

原来我的 secretOrKey 与我创建 JWT 令牌的 secretOrKey 不匹配。

I.E护照策略需要相同secretOrKey

passport.use(new JWTStrategy(
        jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
        secretOrKey   : 'jwt_secret_key'
    ,
    function (jwtPayload, cb) 
        console.log('jwtPayload', jwtPayload)
    
));

作为

const secretOrKey = 'jwt_secret_key'
const token = jwt.sign(payload, secretOrKey,  expiresIn );

【讨论】:

这发生在我身上,我发现它是密钥。检查您的密钥在签名和验证时是否相同。【参考方案2】:

我遇到了同样的问题,我在 github 上找到了这个。 https://github.com/themikenicholson/passport-jwt/issues/153

您必须将ExtractJwt.fromAuthHeaderAsBearerToken() 更改为ExtractJwt.fromAuthHeaderWithScheme('jwt')ExtractJwt.fromAuthHeaderWithScheme('JWT')

【讨论】:

您能否扩展您的答案,为什么这可以解决问题? 对我来说,它使用ExtractJwt.fromAuthHeaderWithScheme("Bearer") 工作,我认为它也可以用作ExtractJwt.fromAuthHeaderAsBearerToken()。因此,该论点基本上讲述了身份验证方案,在这种 OP 的情况下,它应该是 Bearer 而不是 JWT 谢谢,现在工作正常。 ExtractJwt.fromAuthHeaderWithScheme('jwt')【参考方案3】:

我想分享我的答案。我花了一个小时解决这个问题,结果是我配置 Postman 的错误。

所以我是 node-express 的新手,我已经制作了 1 个生产级 rest api 应用程序,但在第二个项目中,我无法解决问题。

我通过config.js 使用常量,所以这些键肯定不是我的问题。

所以回到 Postman,我检查了我旧项目的 postman 收藏。我检查了Header,它只有一个Authorization 键。值类似于:Bearer xxxxx。当我回到我当前的项目时,我想知道为什么我的Authorization 键的值是Bearer Bearer xxx...

我想在使用 Postman 的 AUTHORIZATION OAUTH2.0 时必须删除 Bearer 的东西。瞧!干得好!我一定是忘记了 Postman 中的正确配置。

以下是我设置 JwtStrategy 的方法:

// JSON WEB TOKENS STRATEGY
passport.use(new JwtStrategy(
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  secretOrKey: config.JWT_SECRET
, async (payload, done) => 

  console.log("Find by pk, JWT strategy:", payload.sub)

  db.User.findByPk(payload.sub, 

【讨论】:

【参考方案4】:

如果您正在关注 NestJS 的文档,似乎有些内容被遗漏了。请确保您在签名期间也传递了秘密。我的 .env 文件中有我的,因此下面的代码 sn-p:

this.jwtService.sign(payload, secret: `$process.env.SECRET`),

【讨论】:

以上是关于Passport JWT 策略没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

Passport & JWT & Google/Facebook 策略 - 如何结合 JWT 和 Google/Facebook 策略?

Passport 策略如何知道在 nestJS 中选择正确的 jwt 策略?

Passport JWT 策略提取选项

在同一应用程序上使用 Passport Local 和 JWT 策略(在同一条路线上)

如何使用 passport-jwt 验证路由?

我在我的 nestJS 应用程序(使用 authGuard)中使用了 passport-jwt 身份验证策略,如何访问我的控制器中的令牌有效负载?