Passport.js中req.user仅返回username字段问题排查
问题根因
req.user仅返回username字段的问题出在passport-config.js的反序列化逻辑中。
Passport的会话处理逻辑如下:
- 用户登录校验通过后,
serializeUser方法会将用户唯一标识(你这里存的是user.id)写入session - 后续每次发起请求,Passport都会调用
deserializeUser方法,用session中存储的id查询数据库,将返回结果挂载到req.user上 - 你当前的
deserializeUser逻辑中,手动构造返回的用户信息对象时,仅写入了username字段,自然无法获取email等其他用户属性。
存在问题的反序列化代码段:
passport.deserializeUser((id, cb) => { User.findOne({ _id: id }, (err, user) => { const userInformation = { username: user.username, }; cb(err, userInformation); }); });
修复方案
二选一即可:
- 方案1:返回剔除敏感字段后的完整用户对象(推荐)
查询到完整用户文档后,剔除密码这类不需要返回给前端的敏感字段,直接返回剩余所有属性:passport.deserializeUser((id, cb) => { User.findOne({ _id: id }, (err, user) => { if (err) return cb(err); if (!user) return cb(null, false); // 把mongoose文档转成普通对象,剔除password字段 const { password, ...userInfo } = user.toObject(); cb(null, userInfo); }); }); - 方案2:手动指定需要返回的字段
如果不需要返回全量用户属性,就在构造用户信息对象时,把需要的字段逐一加上:passport.deserializeUser((id, cb) => { User.findOne({ _id: id }, (err, user) => { if (err) return cb(err); if (!user) return cb(null, false); const userInformation = { _id: user._id, username: user.username, email: user.email, createdAt: user.createdAt // 其他需要的字段按这个格式补充 }; cb(err, userInformation); }); });
注意:修改完成后重启服务,清除浏览器本地旧的cookie/session后再测试,避免旧session缓存的残缺用户数据影响结果。
内容的提问来源于stack exchange,提问作者Akhil-Sharma02
相关产品推荐
相关产品推荐

