使用Passport.js时无法访问req.user.username的问题求助
解决Passport.js中req.user仅返回ID无法获取username的问题
问题出在你的passport.deserializeUser配置上:你在查询到用户后,只把user.id传递给了done回调,而不是完整的用户对象。这会导致会话中仅存储用户ID,后续请求的req.user自然就只有ID,无法访问username等其他字段。
修改后的Passport配置(重点修改deserializeUser)
const passport = require('passport') const GoogleStrategy = require('passport-google-oauth20') const User = require('../models/User') passport.serializeUser((user, done) => { done(null, user.id) // 这里逻辑正常,仅将用户ID存入会话 }) // 修正此处:传递完整的user对象,而非仅user.id passport.deserializeUser((id, done) => { User.findById(id).then((user) => { done(null, user) }) }) passport.use( new GoogleStrategy({ callbackURL: '/auth/google/redirect', clientID: process.env.clientID, clientSecret: process.env.clientSecret }, (accessToken, refreshToken, profile, done) => { User.findOne({googleId:profile.id}).then((currentUser) => { if(currentUser){ console.log('user is: ' + currentUser) done(null, currentUser) } else { new User({ username: profile.displayName, googleId: profile.id }).save().then((newUser) => { console.log('new user created' + newUser) done(null, newUser) }) } }) }))
修正后验证
修改完成后,访问个人资料页面时,req.user会是完整的用户对象,你可以正常访问req.user.username。
另外补充:你的登出路由尚未实现完整逻辑,建议添加Passport官方的登出处理:
router.get('/logout', (req, res) => { req.logout((err) => { if (err) { return next(err); } res.redirect('/login'); }); })
内容的提问来源于stack exchange,提问作者fowwest74
相关产品推荐
相关产品推荐

