我使用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
非常感谢任何帮助或建议!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
问题已解决。问题出在信任代理上。由于我正在运行多个域名服务器,后端位于反向代理之后。通过启用信任代理,我的后端应用程序将了解到它位于代理之后,并且可以信任X-Forwarded-头字段。为了启用它,我在后端应用程序中添加了以下代码:
app.set("trust proxy", 1);