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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:30:46