TypeScript+Passport OAuth2.0项目中req.user为undefined问题求助
req.user 始终返回undefined的原因及修复方案
1. verifyCallback 未正确传递用户对象给done函数
你的verifyCallback里,不管用户是否存在,都调用done(null, profile),但正确的做法应该是传递数据库中的用户对象(user),而非Google返回的profile。传递profile会导致后续会话序列化/反序列化逻辑无法关联到数据库用户,甚至直接导致会话无法正确建立。同时,catch块中未调用done(err)传递错误,会让Passport无法处理异常,中断会话流程。
修复代码:
async function verifyCallback(accessToken: any, refreshToken: any, profile: any, done: any) { const newUser = { googleId: profile.id, displayName: profile.displayName, email: profile.emails[0].value, Image: profile.photos[0].value, }; try { let user = await Oauth.findOne({ googleId: profile.id }); if (user) { done(null, user); // 传递数据库用户对象 } else { user = await Oauth.create(newUser); done(null, user); // 传递新创建的用户对象 } } catch (err) { console.log(err); done(err); // 必须传递错误,让Passport处理异常 } }
2. deserializeUser 未从数据库加载用户
当前deserializeUser只是直接返回id,没有根据id查询数据库中的用户,导致req.user无法获取到完整的用户对象,甚至出现undefined。需要在反序列化时从数据库加载用户:
修复代码:
passport.deserializeUser(async (id: any, done) => { try { const user = await Oauth.findById(id); done(null, user); // 将查询到的用户对象赋值给req.user } catch (err) { done(err); } });
3. checkLoggedIn 函数逻辑错误
你硬编码const isLoggedIn = true,完全跳过了真实的登录状态检查,应该直接判断req.user是否存在:
修复代码:
function checkLoggedIn(req: Request, res: Response, next: NextFunction): any { console.log('current user is: ', req.user); if (!req.user) { // 真实判断用户是否登录 return res.status(401).json({ error: 'you must log in', }); } next(); }
4. 可能遗漏路由挂载
确保你已经将router挂载到app实例上,否则所有路由配置都不会生效,自然无法建立会话。在代码末尾添加:
app.use(router);
5. cookieSession 配置检查
确认config.COOKIE_KEY_1和config.COOKIE_KEY_2是有效的非空字符串,密钥为空或未定义会导致cookie无法正确签名,会话无法持久化。
内容的提问来源于stack exchange,提问作者Nasiru Ismail
相关产品推荐
相关产品推荐

