登录成功后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
相关产品推荐
相关产品推荐

