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

登录成功后req.isAuthenticated()为false,req.user获取失败求助

问题根源及解决办法

1. req.logIn 异步操作未等待,Session 未完成保存

req.logIn 是异步方法,当前代码调用后直接返回用户,此时 Passport 还没完成用户信息的序列化与 Session 存储,导致后续请求无法读取登录态。

修复代码:将 req.logIn 包装为 Promise,等待执行完成:

async login(
  _: any,
  args: UserFindArgs,
  { req, res }: Context
): Promise<User | null> {
  const user = await prisma.user.findUnique({
    where: { nickname: args.nickname },
  });
  if (!user) return null;

  // 等待 req.logIn 完成 Session 存储
  await new Promise<void>((resolve, reject) => {
    req.logIn(user, (err) => {
      if (err) reject(err);
      else resolve();
    });
  });

  console.log(req.user);
  return user;
},

2. CORS 配置缺失凭证允许

Apollo Server 的 CORS 配置未开启凭证支持,前端请求无法携带 Cookie,服务端无法识别 Session。

修复 index.ts 中的 CORS 配置:

apolloServer.applyMiddleware({
  app,
  cors: {
    origin: "http://138.68.66.201:5000",
    credentials: true, // 添加此行允许携带凭证
  },
});

同时前端请求需设置 withCredentials: true(如 Apollo Client 在 createHttpLink 中配置)。

3. deserializeUser 错误处理不规范

Passport 的 done 回调第一个参数必须是 Error 对象,直接传字符串会导致反序列化异常。

修复 deserializeUser:

passport.deserializeUser(async function (id: number, done) {
  const user = await prisma.user.findUnique({
    where: { id },
  });
  if (!user) {
    return done(new Error("cannot find user")); // 改为 Error 对象
  }

  done(null, { id: user.id, username: user.nickname });
});

4. Session 配置优化

saveUninitialized: true 会存储未初始化的无效 Session,建议改为仅在登录后创建 Session:

session({
  name: "mnbmnbmbn",
  secret: "somesecret",
  resave: false,
  saveUninitialized: false, // 改为 false
  cookie: {
    maxAge: 1000 * 60 * 60 * 24 * 7,
    sameSite: "lax",
    secure: false,
  },
})

内容的提问来源于stack exchange,提问作者teilai teilai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:55:19