护照-JWT 验证未触发回调

passport-jwt verify callback is not triggered

本文关键字:回调 -JWT 验证 护照      更新时间:2023-09-26

玩passport-jwt,我一直在设置一个基本的http端点来获取我的令牌(使用passport-http)

它有效。

我想使用护照文档中描述的模式定义我自己的成功|错误回调:

app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
});

现在我想让 passport-jwt 作为我的一些路由的中间件,因为我不必在其中重复调用 passport.authenticate。所以我设置了这个模块:

var logger = require('../util/logger');
var cfg = require('../cfg');
var router = require('express').Router();
var passport = require('passport');
var JwtStrategy = require('passport-jwt').Strategy;
var User = require('../model/user');

var opts = {};
opts.jwtFromRequest = function(req) {
  var token = null;
  if (req && req.cookies) {
    token = req.cookies.jwt;
  }
  logger.info('jwtFromRequest::token: ' + token); // shown: 'JWT <token_string>''
  return token;
};
opts.secretOrKey = cfg.secret;
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
  logger.info('verify::authenticating request using jwtStrategy'); // not shown
  User.findOne({
    username: jwt_payload.username
  }, function(err, user) {
    if (err) {
      logger.info('verify::error: ' + err); 
      return done(err, false);
    }
    if (user) {
      logger.info('verify::user: ' + user); 
      return done(null, user); 
    } else {
      logger.info('verify: user not found'); 
      return done(null, false);
    }
  });
}));
var Filter = function(req, res, next) {
  passport.authenticate('jwt', {
    session: false
  }, function(err, user) {
    if (err) {
      logger.error(err);
      return next(err);
    }
    if (!user) {
      var payload = {}
      logger.info("filter::user " + user); // shows false
      if (req.params && req.params.resource) {
        payload.resource = req.params.resource
      }
      payload.message = 'authentication failure'
      return res.status(401).send(payload); // 401 is sent
    } 
    next();
  })(req, res, next);
}
module.exports = Filter; 

我的路线也是如此:

router.get('/', filter, function(req, res, next) {
  // doing some business
});

尽管我得到了一个令牌,但我无法让身份验证工作(身份验证返回 401),并且在附加的验证函数中没有收到任何日志记录指令)。

根据 passport-jwt 源代码,我对调用的自定义 jwtFromRequest 函数感到无能为力,而验证函数显然不是。

为什么这个函数以不被调用结束?

我的错误。问题是我在令牌前面加上了"JWT",如本教程所示,这里似乎不需要。