护照 JWT 策略未被调用

9
我正在尝试使用passport中间件授权我的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)
    }
));

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

我正在使用Postman进行测试,并从授权选项中选择Bearer Token。 我可以看到它正在向我的请求添加一个标头。

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

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

那么中间件应该检测到令牌并调用中间件吗?
任何帮助都将不胜感激。

所以...假设你的代码中有这一行 app.use(passport.initialize()) - James
不,我没有。我刚刚让它工作了。看起来我的策略中的secretOrKey与我创建令牌的secretOrKey不匹配。不确定为什么它一直默默失败,但现在看起来问题已经解决了。 - Stretch0
我一直以为在使用Express w/ Passport时,passport.initialize()是必需的。 - James
你有它使用的示例吗?也许我没有意识到什么。 - Stretch0
它仍然在文档中,查看“middleware”部分。 - James
4个回答

7
原来我的secretOrKey和我创建JWT令牌时的secretOrKey不匹配。即,passport策略需要具有相同的secretOrKey
passport.use(new JWTStrategy({
        jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
        secretOrKey   : 'jwt_secret_key'
    },
    function (jwtPayload, cb) {
        console.log('jwtPayload', jwtPayload)
    }
));

as

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

这种情况曾经发生在我身上,后来我发现问题出在密钥上。请确保您在签名和验证过程中使用的密钥相同。 - tksilicon

3

2
你能否详细解释一下,为什么这个方法可以解决问题? - Artjom B.
1
对我来说,使用ExtractJwt.fromAuthHeaderWithScheme("Bearer")可以正常工作,我认为也可以使用ExtractJwt.fromAuthHeaderAsBearerToken()。因此,该参数基本上告诉了身份验证方案,在这种情况下,应该是Bearer而不是JWT。 - Umair Malhi
谢谢,现在已经可以正常工作了。ExtractJwt.fromAuthHeaderWithScheme('jwt') - Habibul Hasan

1
如果您正在遵循 NestJS 的文档,可能有些内容被省略了。请确保在签名过程中也传递了密钥。我将我的密钥放在 .env 文件中,因此以下是代码片段:
this.jwtService.sign(payload, {secret: `${process.env.SECRET}`}),

0

我想分享我的答案。我花了一个小时来解决这个问题,结果发现是我在配置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, {

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接