NodeJS 既然我们不能在不同的域之间共享cookie,基于会话的身份验证是如何工作的?

jogvjijk  于 2023-02-12  发布在  Node.js
关注(0)|答案(1)|浏览(132)

我使用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);
cigdeys3

cigdeys31#

是的,您对cookies不能在不同的域之间共享的理解是正确的。如果您的前端和后端部署在不同的域上,那么您将很难在前端访问后端设置的cookies。
在主域的子域上托管后端是解决这个问题的一个方法。例如,如果您的主域是example.com,您可以在api.example.com托管后端。这样,前端和后端将位于同一个主域下,您可以在它们之间共享cookie。
不过,也有其他解决方案,例如使用基于令牌的身份验证系统,其中后端在成功登录后返回令牌,前端可以将此令牌存储在本地存储或cookie中。然后,前端可以在后续API请求的报头中发送此令牌,以在后端对用户进行身份验证。这种方法比使用cookie更安全。因为cookie通常以纯文本存储并且容易被破坏。

相关问题