You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用passport-jwt与epilogue时req.user为空的问题排查

解决passport-jwt + epilogue中req.user为空的问题

我帮你定位到问题所在了!你在使用passport-jwt的自定义回调时,遗漏了一个关键步骤——没有把验证通过的user挂载到req.user上,这就导致后续epilogue的list.auth中间件里拿不到用户信息。

问题根源

默认情况下,passport.authenticate在验证成功后会自动将用户对象赋值给req.user,但当你使用自定义回调函数(也就是你代码里的(err, user, info) => {...}部分)时,Passport的自动赋值逻辑会被跳过,需要我们手动完成这一步。

修改后的中间件代码

把你的isAuthenticated中间件修改成这样,在验证成功后添加req.user = user;:

exports.isAuthenticated = (req, res, context) => {
  return new Promise((resolve, reject) => {
    return passport.authenticate('jwt', { session: false }, (err, user, info) => {
      if (err) {
        res.status(500).send({ message: 'Internal Server Error' })
        return resolve(context.stop);
      }
      if (user) {
        // 关键:手动将验证通过的user挂载到req.user上
        req.user = user;
        return resolve(context.continue);
      } else {
        res.status(401).send({ message: 'Unauthorized' })
        return resolve(context.stop)
      }
    })(req, res);
  });
}

额外检查点

除了上面的修改,你还可以确认以下几点,确保整个流程正常:

  • 确认你的passport-jwt策略配置正确,secretOrKey和jwtFromRequest(比如从请求头的Authorization字段提取token)的设置没有问题,保证token能被正确解析出用户信息。
  • 确保请求时携带了有效的JWT token,并且token里包含了正确的用户标识(比如id),这样passport才能从数据库中找到对应的user对象。

修改完成后,再运行代码,你应该就能在list.auth里看到req.user输出正确的用户信息了。

内容的提问来源于stack exchange,提问作者Shamoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:08:35