我使用passport js在我的MERN堆栈应用程序中使用谷歌认证。我已经部署了前端到vercel和后端渲染。在我的localhost中,我可以成功登录,它从后端返回cookie到我的前端。但在部署版本中,当我尝试登录时,它确实登录,但它不返回任何cookie到前端。我做了一些研究,发现cookie可以'我的问题是我应该在一个子域中托管我的后端,而在主域中托管前端吗?
前端:https://passport-frontend-seven.vercel.app/后端:https://popupchat-backend.onrender.com/
//如何使用express会话:
app.use(
session({
secret: "secretcode",
resave: false,
saveUninitialized: true,
cookie: {
httpOnly: true,
sameSite: "none",
secure: true,
domain: process.env.CLIENT_URL,
maxAge: 1000 * 60 * 60 * 24 * 7, // One Week
},
})
);
app.set("trust proxy", 1);
1条答案
按热度按时间cigdeys31#
是的,您对cookies不能在不同的域之间共享的理解是正确的。如果您的前端和后端部署在不同的域上,那么您将很难在前端访问后端设置的cookies。
在主域的子域上托管后端是解决这个问题的一个方法。例如,如果您的主域是example.com,您可以在api.example.com托管后端。这样,前端和后端将位于同一个主域下,您可以在它们之间共享cookie。
不过,也有其他解决方案,例如使用基于令牌的身份验证系统,其中后端在成功登录后返回令牌,前端可以将此令牌存储在本地存储或cookie中。然后,前端可以在后续API请求的报头中发送此令牌,以在后端对用户进行身份验证。这种方法比使用cookie更安全。因为cookie通常以纯文本存储并且容易被破坏。