首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >passport-jwt验证回调未触发

passport-jwt验证回调未触发
EN

Stack Overflow用户
提问于 2016-07-09 04:03:07
回答 1查看 1.2K关注 0票数 0

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

它起作用了。

我想使用passport documentation中描述的模式来定义我自己的成功|错误回调

代码语言:javascript
复制
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。所以我设置了这个模块:

代码语言:javascript
复制
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; 

这就是我的路线:

代码语言:javascript
复制
router.get('/', filter, function(req, res, next) {
  // doing some business
});

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

根据passport-jwt source code的说法,我对被调用的自定义jwtFromRequest函数感到一无所知,而verify函数显然不是。

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

EN

回答 1

Stack Overflow用户

发布于 2016-07-09 17:00:33

是我的错。问题是我在标记前面加上了'JWT‘,如this tutorial中所示,这里似乎并不需要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38274555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档