firebase 尽管有显式命名,但由于域名不匹配,将不会设置会话Cookie

92dk7w1h  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(176)

我无法理解为什么我的(会话)cookie不会被设置在客户端。devtools上显示的错误如下:
通过Set-Cookie标头设置Cookie的尝试被阻止,因为其Domain属性对于当前主机URL无效。

我做了一些研究,原来这是一个域的问题,因为前端(Firebase)和后端(云运行)是在不同的域名。
令我不安的是,当我的前端在本地主机上运行时,这个问题不会出现(即使后端仍然是远程的,在云上运行)。
以下是我配置会话的方法:

app.set('trust proxy', 1);
  app.use(json());
  app.use(
    session({
      name: '__session',
      store: new RedisStore({ client: redisClient }),
      secret: options.sessionSecret,
      resave: false,
      saveUninitialized: false,
      cookie: {
        secure: process.env.NODE_ENV === 'PROD' ? true : 'auto',
        httpOnly: true,
        maxAge: 1000 * 60 * 60 * 24 * 7,
        sameSite: process.env.NODE_ENV === 'PROD' ? 'none' : 'lax',
        domain: '<FRONTEND_URL>',
      },
    })
  );

我觉得domain属性不正确,但我提供了前端域、后端域和后端的根域(run.app
我是不是漏掉了什么?还是误解了什么?

EDIT:

正如您所看到的,Secure; SameSite=None在cookie中提供。

41zrol4v

41zrol4v1#

不能使用run.appa.run.app,因为它们包含在Mozilla基金会的Public Suffix List中。Heroku文档中有great article about this issue
要解决此问题,您可以:
1.在你的应用上设置自定义域。比如client.example.comapi.example.com
1.在一个Cloud Run示例中部署客户端和API。
1.使用不同的身份验证策略,如令牌身份验证。客户端根据令牌交换凭据并将其存储在浏览器本地存储中。然后,客户端在每次请求时发送令牌。
希望能有所帮助!

相关问题