【问题标题】:req.user is undefined when using PassportJS, SequelizeJS and JWT tokens使用 PassportJS、SequelizeJS 和 JWT 令牌时 req.user 未定义
【发布时间】:2017-05-31 08:22:54
【问题描述】:

我已经在 Stackoverflow 上检查了多个答案,并且还查看了文档,但我仍然无法找出可能是什么问题。在我的应用程序中,我使用 SequelizeJS 访问我的 mySQL 数据库,现在我尝试使用 JWT 策略使用 PassportJS 保护我的 REST API 端点。

./app.js

// ...
// passport
app.use(passport.initialize());
require('./config/passport')(passport);
// ...

./config/passport.js

var passport     = require('passport');
var passportJwt  = require('passport-jwt');
var models       = require('../models');
var config       = require('./config');

var ExtractJwt = passportJwt.ExtractJwt;
var Strategy   = passportJwt.Strategy;

module.exports = function(passport) {
    var params = {
        secretOrKey: config.jwt.secret,
        jwtFromRequest: ExtractJwt.fromAuthHeader()
    };

    passport.use(new Strategy(params, function(jwt_payload, done) {
        models.User.findOne({
            where: {
                id: jwt_payload.id
            }
        }).then(
            function(user) {
                if (user) {
                    done(null, user);
                } else {
                    done(null, false);
                }
            },
            function(err) {
                return done(err, false);
            }
        );
    }));
};

我正在尝试从这个简单路由的请求中获取用户实体:

var router    = express.Router();
// ...
router.route('/user/me', passport.authenticate('jwt', {  session: false }))
    .get(function(req, res) {
        console.log(req.user);
        res.json(req.user);
    });

我已经创建了另一个路由,它根据提供的用户名和密码返回 JWT 令牌。当我调用 /user/me 端点时,我将 JWT 令牌附加到标头中,例如:

Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.M9z3iWNdjAu4THyCYp3Oi3GOWfRJNCYNUcXOw1Gd1Mo 

所以,我的问题是,当我使用令牌调用 /user/me 端点时,req.user 将是未定义的,我无法弄清楚是什么原因。

提前感谢您的帮助!

【问题讨论】:

  • 只是为了确保,您是否检查了您的模型搜索查询返回的内容?我的意思是 .then() 函数中的用户
  • 我不知道如何检查策略中的查询,但我使用硬编码的 { id: 1 } 过滤器执行,它工作正常。它返回一个 JSON 对象。

标签: javascript node.js express sequelize.js passport.js


【解决方案1】:

您的路由定义似乎有误:router.route 在其第二个参数中不接受中间件,因此根本不会进行身份验证。

应该是这样的

var router    = express.Router();
// ...
router.route('/user/me')
    .all(passport.authenticate('jwt', {  session: false }))
    .get(function(req, res) {
        console.log(req.user);
        res.json(req.user);
    });

【讨论】:

  • 非常感谢,真丢人:)
猜你喜欢
  • 2021-08-16
  • 2019-12-10
  • 2019-09-19
  • 1970-01-01
  • 2021-08-16
  • 2020-08-23
  • 2018-11-18
  • 2018-02-23
  • 1970-01-01
相关资源
最近更新 更多