护照JWT – 未经授权

我遇到了一个问题,那就是它总是返回给我。 当我设置标题授权给收到的令牌。 它返回。

擅自

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); }); })); 

你必须改变这些东西:

1)您必须将jwtFromRequest:ExtractJwt.fromAuthHeader()更改为jwtFromRequest:ExtractJwt.fromAuthHeaderAsBearerToken(),

2)设置标题:Authorization:Bearer {token}

3)jwt_payload._id更改为jwt_payload._doc._id

我遇到了同样的问题! 下面的代码为我工作。

 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"); }); 

您可能必须在请求标题中犯了一个错误。 根据自述文件 ,它应该是'Authorization'='不记名token_received_on_login'

只需要一个更改,使用jwt_payload._doc.id而不是jwt_payload.id