使用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
相关产品推荐
相关产品推荐

