Passport JWT - 未经授权
Posted
技术标签:
【中文标题】Passport JWT - 未经授权【英文标题】:Passport JWT - Unauthorized 【发布时间】:2017-01-12 22:02:06 【问题描述】:我遇到了一个问题,它总是在未经授权的情况下返回给我。当我将标题授权设置为收到的令牌时。它返回。
未经授权
.
router.get('/dashboard', passport.authenticate('jwt', session: false), (req, res) =>
res.json('It worked: User ID is: ' + req.user._id);
);
.
var jwtOptions =
jwtFromRequest: ExtractJwt.fromAuthHeader(),
secretOrKey: config.jwt.secretOrKey
//issuer: config.jwt.issuer,
//audience: config.jwt.audience,
;
passport.use(new JWTStrategy(jwtOptions, (jwt_payload, done) =>
User.findOne(id: jwt_payload.id, (err, user) =>
if (err)
return done(err, false);
if (!user)
return done(null, false);
return done(null, user);
);
));
【问题讨论】:
确保您使用相同的SecretKey
来签署令牌和验证传入令牌,并确保您将令牌过期时间保持足够长,以便它不会很快过期你的测试。
【参考方案1】:
你必须改变这些事情:
1) 你必须改变
jwtFromRequest: ExtractJwt.fromAuthHeader(),
到 jwtFromRequest :ExtractJwt.fromAuthHeaderAsBearerToken(),
2) 设置标题:
Authorization:Bearer token
3) jwt_payload._id
更改为 jwt_payload._doc._id
【讨论】:
这对我有用,除了第三步只需要你签署令牌的内容(在我的情况下是用户名)Set the header: Authorization:Bearer token
为我工作。
第三点可能会根据 passport 和 passport-jwt 的版本而改变。您应该始终使用console.log(jwt_payload)
检查内容。在某些情况下(passport 0.4.0 和 passport-jwt 4.0.0),您应该使用 jwt_payload.payload._id。【参考方案2】:
我遇到了同样的问题!下面的代码对我有用。
module.exports = function(passport)
passport.use(new JwtStrategy(opts, function(jwt_payload, done)
User.findById(jwt_payload._id, function(err, user)
if (err)
return done(err, false);
if (user)
done(null, user);
else
done(null, false);
);
));
;
问题在于User.findOne(id: jwt_payload.id, ...
在将令牌附加到标头时,在 AJAX 调用中以这种格式使用“beforeSend”:
$.ajax(
url: url,
type: 'POST',
data: data,
beforeSend: function(xhr)
xhr.setRequestHeader('Authorization', window.localStorage.getItem('token'));
,
success: function(data)
console.log(data);
,
error: console.log("Error");
);
【讨论】:
【参考方案3】:您可能在request header
中犯了一个错误。
根据README,应该是'Authorization' = 'bearer token_received_on_login'
【讨论】:
【参考方案4】:只需进行一项更改,使用jwt_payload._doc.id
而不是jwt_payload.id
【讨论】:
【参考方案5】:将标头从res.json(token: 'JWT ' + token)
设置为res.json(token: 'Bearer ' + token)
jwt_payload.data._id
为我工作
【讨论】:
【参考方案6】:VS 代码服务器挂起,这是由于您的代码中的一些错误而发生的。 它不特定于任何常见的代码更改。 它可能是您所做的任何小代码错误。 就我而言 我正在使用
app.use(express.json)
而不是
app.use(express.json())
【讨论】:
以上是关于Passport JWT - 未经授权的主要内容,如果未能解决你的问题,请参考以下文章