Passport JWT策略未被调用

时间:2018-04-04 13:50:35

标签: node.js jwt passport.js express-jwt

我正在尝试使用护照中间件授权我的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',
},

那么中间件应该检测到承载令牌并调用中间件吗?

任何帮助将不胜感激

4 个答案:

答案 0 :(得分:0)

原来我的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 });

答案 1 :(得分:0)

我面临同样的问题,我在github上发现了这个问题。 https://github.com/themikenicholson/passport-jwt/issues/153

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

答案 2 :(得分:0)

我想分享我的答案。我花了一个小时弄清楚这个问题,事实证明这是我配置Postman的错。

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

我正在通过.updateMany()使用常量,因此,确定键不是我的问题。

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

我认为使用Postman的Bearer Bearer xxx时必须删除Bearer。瞧!做得好!我一定忘记了邮递员的正确配置。

这是我设置 JwtStrategy 的方法:

AUTHORIZATION OAUTH2.0

答案 3 :(得分:0)

如果您正在关注 NestJS 的文档,那么似乎遗漏了一些内容。请确保您在签名时也传递了秘密。我的 .env 文件中有我的,因此代码片段如下:

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