会话cookie在应用部署后无法保存的问题
P粉312631645
P粉312631645 2023-08-29 09:37:44
[React讨论组]

我使用React创建了一个前端应用程序,然后将其部署到Netlify上。前端应用程序与我创建并部署到Render上的express后端应用程序进行交互。前端和后端之间的任何交互都受到使用passportjs进行身份验证的保护。后端应用程序使用passport的本地策略,通过与mongoDB连接验证用户是否存在/用户名和密码是否正确。一旦确认,我使用passport的序列化和反序列化函数来维护登录会话。

在开发过程中,我在http://localhost上使用此应用程序。在此期间,一切都按预期工作。登录会话保存为cookie,我能够将其作为将来请求中的一部分发送到后端应用程序以验证用户。

当我将前端应用程序部署到Netlify和后端应用程序部署到Render时,会话cookie不再保存,这意味着用户无法在后端进行身份验证,因为每个登录后的请求都没有保存的会话cookie发送到后端。

稍微详细一些,用于与passport一起创建登录会话的express-session,我使用connect-mongo将会话存储在MongoDB上。每次我通过前端登录时,我都可以看到会话被创建并存储在MongoDB中。问题似乎是响应中的cookie没有传递过来,我不知道为什么。

这是我目前在express后端应用程序中的会话选项:

app.use(
  session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false,
    store: MongoStore.create({ mongoUrl: process.env.MONGODB_URI }),
    cookie: {
      secure: true,
      sameSite: "none",
      httpOnly: true,
      expires: 24 * 60*60*1000
    }
  })
);

我尝试过搜索解决方案,并尝试了许多选项,包括更改secure,更改httpOnly,将sameSite设置为false和none,添加指向前端URL的domain以及指向后端URL的另一个domain,删除我安装的任何安全包,如helmet和速率限制器,但似乎没有任何效果。

我还将凭据的访问控制头设置为true:

app.use((req, res, next) => {
  res.setHeader("Access-Control-Allow-Origin", process.env.DOMAIN_URL);
  res.setHeader("Access-Control-Allow-Credentials", true);
  res.setHeader("Access-Control-Allow-Headers", "Content-Type");
  res.header("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE");
  next();
});

对于所有的请求,我都使用fetch。我遇到了一个类似于我的问题,但没有得到解答:Browser not saving session cookie from cross domain server

非常感谢任何帮助或建议!

P粉312631645
P粉312631645

全部回复(1)
P粉714890053

问题已解决。问题出在信任代理上。由于我正在运行多个域名服务器,后端位于反向代理之后。通过启用信任代理,我的后端应用程序将了解到它位于代理之后,并且可以信任X-Forwarded-头字段。为了启用它,我在后端应用程序中添加了以下代码:

app.set("trust proxy", 1);
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号