Passport JWT 策略没有被调用
Passport JWT Strategy not getting called
我正在尝试使用护照中间件授权我的 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
。我可以看到这是在我的请求中添加 header。
当我在我的节点应用程序中记录我的请求 object 时,我可以看到它看起来像这样:
headers: {
authorization: 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YWM0YWI2ZTk1MWJiMjE1M2NhMjc0OWUiLCJmaXJzdF9uYW1lIjoiQW5kcmV3IiwibGFzdF9uYW1lIjoiTWNDYWxsdW0iLCJlbWFpbCI6ImFtY2NhbGx1bTg5QGdtYWlsLmNvbSIsImlhdCI6MTUyMjg0NzEyNSwiZXhwIjoxNTIyODUwNzI1fQ.WH12GJHMGrGsiJNIwUG2Dx_a9cZKjw7_SW8FYlEvLmk',
accept: '*/*',
host: 'localhost:3037',
},
所以中间件应该检测承载令牌并调用中间件?
如有任何帮助,我们将不胜感激
原来我的 secretOrKey
与我创建 JWT 令牌的 secretOrKey
不匹配。
I.E passport 策略需要有相同的 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 });
我遇到了同样的问题,我在 github 上发现了这个问题。
https://github.com/themikenicholson/passport-jwt/issues/153
您必须将 ExtractJwt.fromAuthHeaderAsBearerToken()
更改为 ExtractJwt.fromAuthHeaderWithScheme('jwt')
或 ExtractJwt.fromAuthHeaderWithScheme('JWT')
我想分享我的答案。我花了一个小时弄清楚这个问题,结果是我配置 Postman 的错。
所以我是 node-express 的新手,我已经制作了 1 个生产休息 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, {
如果您正在关注 NestJS 的文档,似乎遗漏了一些内容。请确保您在签名期间也传递了秘密。我的 .env 文件中有我的,因此是下面的代码片段:
this.jwtService.sign(payload, {secret: `${process.env.SECRET}`}),
我正在尝试使用护照中间件授权我的 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
。我可以看到这是在我的请求中添加 header。
当我在我的节点应用程序中记录我的请求 object 时,我可以看到它看起来像这样:
headers: {
authorization: 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YWM0YWI2ZTk1MWJiMjE1M2NhMjc0OWUiLCJmaXJzdF9uYW1lIjoiQW5kcmV3IiwibGFzdF9uYW1lIjoiTWNDYWxsdW0iLCJlbWFpbCI6ImFtY2NhbGx1bTg5QGdtYWlsLmNvbSIsImlhdCI6MTUyMjg0NzEyNSwiZXhwIjoxNTIyODUwNzI1fQ.WH12GJHMGrGsiJNIwUG2Dx_a9cZKjw7_SW8FYlEvLmk',
accept: '*/*',
host: 'localhost:3037',
},
所以中间件应该检测承载令牌并调用中间件?
如有任何帮助,我们将不胜感激
原来我的 secretOrKey
与我创建 JWT 令牌的 secretOrKey
不匹配。
I.E passport 策略需要有相同的 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 });
我遇到了同样的问题,我在 github 上发现了这个问题。 https://github.com/themikenicholson/passport-jwt/issues/153
您必须将 ExtractJwt.fromAuthHeaderAsBearerToken()
更改为 ExtractJwt.fromAuthHeaderWithScheme('jwt')
或 ExtractJwt.fromAuthHeaderWithScheme('JWT')
我想分享我的答案。我花了一个小时弄清楚这个问题,结果是我配置 Postman 的错。
所以我是 node-express 的新手,我已经制作了 1 个生产休息 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, {
如果您正在关注 NestJS 的文档,似乎遗漏了一些内容。请确保您在签名期间也传递了秘密。我的 .env 文件中有我的,因此是下面的代码片段:
this.jwtService.sign(payload, {secret: `${process.env.SECRET}`}),