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

Google OAuth 2.0重定向后Req.user与Session无法持久化求助

Google OAuth登录后Session/User无法持久化问题求助

我已经排查这个问题很久了,能梳理清楚流程但始终无法解决,希望各位能提供帮助。

核心问题:在Google OAuth登录流程中,回调重定向完成后,req.user和req.session无法在后续请求中持久化,但使用Passport本地邮箱/密码登录时完全正常。本地开发环境及Docker容器中Google OAuth功能一切正常,仅线上部署环境出现问题。

技术栈与部署环境

  • 后端:Node.js + Express + Passport.js(Google OAuth2策略 + 本地登录策略)
  • 前端:React,部署在Netlify
  • 数据库:MongoDB Atlas
  • 后端部署:Heroku
  • 会话存储:express-session + connect-mongo(MongoStore)

核心代码片段

客户端Google登录触发函数

const onGoogleLogin = () => {
    try {
        window.open(`${process.env.REACT_APP_SERVER_URL}/api/auth/google`, "_self");
    } catch (err) {
        toast.error(err.response.data);
    }
};

后端Google OAuth路由配置

router.get("/google", passport.authenticate("google", ["profile", "email"]));

router.get(
    "/google/callback",
    passport.authenticate("google", { failureRedirect: '/login/failed', prompt: 'consent', accessType: 'offline' }),
    (req, res) => {
        console.log("Session after Google auth:", req.session);
        console.log("User after Google auth:", req.user);
        res.redirect(process.env.CLIENT_URL);
    },
);

前端重定向后获取用户信息逻辑

const getGoogleProfile = useCallback(async () => {
    try {
        const res = await axios.get('/api/auth/login/success', {
            withCredentials: true,
        });
        context.setUserData(res.data.user);
    } catch (err) {
        console.log(err);
    }
}, []);

useEffect(() => {
    getGoogleProfile();
}, [getGoogleProfile]);

后端/login/success路由

router.get("/login/success", (req, res) => {
    console.log(req.session)
    console.log(req.user)
    if (req.user) {
        res.status(200).json({
            user: req.user,
        });
    } else {
        res.status(403).send("Not authenticated");
    }
});

已验证的关键现象

  1. Google OAuth流程完成后,用户信息已成功写入MongoDB Atlas数据库
  2. MongoStore中能看到对应的Session记录,Passport序列化函数正常执行
  3. 回调路由中可以正常打印req.user和req.session,数据完全正确
  4. 重定向到前端首页后,触发/login/success请求时,后端打印req.session和req.user均为undefined,Passport反序列化函数未执行
  5. 无任何报错日志输出

已尝试的排查与修复动作

  • 反复核对Google API控制台的回调地址、Heroku/Netlify的环境变量配置(均正确)
  • 在回调路由中手动调用req.session.save(),无改善
  • 调整CORS配置,尝试放宽跨域限制(包括credentials、origin等参数)
  • 修改express-session的配置:调整secure、sameSite、domain、path等cookie属性
  • 调整Passport策略的配置参数,重新生成Google OAuth凭据
  • 检查Heroku的会话存储配置,确认MongoStore连接正常

目前暂时考虑更换部署平台或会话存储方案,但希望能找到根本原因解决问题,恳请各位提供思路。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:52:48