我遇到了一个问题,即它总是对我未经授权。当我将标题授权设置为收到的令牌时。它返回。
未经授权
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);
});
}));
答案 0 :(得分:9)
你必须改变这些事情:
1)你必须改变 jwtFromRequest:ExtractJwt.fromAuthHeader(),到jwtFromRequest:ExtractJwt.fromAuthHeaderAsBearerToken(),
2)设置标题: 授权:Bearer {token}
3)jwt_payload._id更改为jwt_payload._doc._id
答案 1 :(得分: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}, ...
同时,在将标记附加到标题时,请使用& cnd"在这种格式的AJAX调用中:
$.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");
});
答案 2 :(得分:2)
您可能必须在请求标头中出错。 根据{{3}},它应该是'Authorization'='bearer token_received_on_login'
答案 3 :(得分:0)
只需要进行一项更改,请使用jwt_payload._doc.id而不是jwt_payload.id
答案 4 :(得分:0)
将标头从res.json({token: 'JWT ' + token})
设置为res.json({token: 'Bearer ' + token})
jwt_payload.data._id
为我工作
答案 5 :(得分:0)
VS代码服务器挂起,这是由于代码中的某些错误而发生的。 它不特定于任何常见的代码更改。 可能是您犯的任何小代码错误。 就我而言 我正在使用
app.use(express.json)
代替
app.use(express.json())