Passport-jwt未经授权

Jon*_*hen 2 node.js jwt passport.js

我是节点js的新手.我正在使用护照jwt进行身份验证.当我试图进行身份验证时,它始终显示"未经授权".

我的passport.js文件

const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const User = require('../models/user');
const config = require('../config/database');

module.exports = function(passport){
  let opts = {};
  opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
  opts.secretOrKey = config.secret;
  passport.use(new JwtStrategy(opts, (jwt_payload, done) => {

    User.getUserById(jwt_payload._doc._id, (err, user) => {
      if(err){
        return done(err, false);
      }

      if(user){
        return done(null, user);
      } else {
        return done(null, false);
      }
    });
  }));
}
Run Code Online (Sandbox Code Playgroud)

用户模型user.js

module.exports.getUserById = function(id, callback){
  User.findById(id, callback);
}
Run Code Online (Sandbox Code Playgroud)

路线

router.get('/profile', passport.authenticate('jwt', {session:false}), (req, res, next) => {
  res.json({user: req.user});
});
Run Code Online (Sandbox Code Playgroud)

当我google时,许多人建议在passport.js中更改此行

User.getUserById(jwt_payload._doc._id, (err, user) => {
Run Code Online (Sandbox Code Playgroud)

我试过了

User.getUserById(jwt_payload._id, (err, user) => {
User.findById(jwt_payload._id, (err, user) => {
Run Code Online (Sandbox Code Playgroud)

现在我还得到同样的错误.

Jon*_*hen 7

我发现了这个问题,在新护照-jwt更新中,我们必须使用

opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
Run Code Online (Sandbox Code Playgroud)


Akh*_*ent 5

如果您使用的opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();是你的jwtFromRequest,然后你的授权头是像

bearer xxxxx.yyyyy.zzzzz

您可以检查BEARER_AUTH_SCHEME指定extract_jwt.js所在的passport-jwt/lib文件夹


如果您使用的opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt')是你的jwtFromRequest,然后你的授权头是像

JWT xxxxx.yyyyy.zzzzz

您可以检查LEGACY_AUTH_SCHEME指定extract_jwt.js所在的passport-jwt/lib文件夹