Firebase https 函数意外删除 `set-cookie` 标头

Joh*_*ohn 2 cookies firebase google-cloud-functions

正如firebase 函数文档中(间接)提到的,https 函数应该支持在请求/响应标头中操作 cookie。

如果您需要注入 cookie 支持或 CORS 等中间件依赖项,请在函数中调用它们。

但是,以下 HTTPS 函数向客户端返回不包含标头的响应:set-cookie

functions.https.onRequest(async (request, response) => {
  response.set('access-control-allow-origin', '*');

  response.cookie('TEST COOKIE', 'Success!!!!');

  console.log(response.get('set-cookie'));

  response.json({ status: 'success' });
});
Run Code Online (Sandbox Code Playgroud)

奇怪的是,对的调用console.log(response.get('set-cookie'))显示set-cookie标头在函数调用中的该点设置的。因此,不知何故,set-cookie标头被从响应中剥离。这看起来确实像 firebase 函数实际上并不支持操作 cookie。

有人知道发生了什么事吗?我已经尝试解决这个问题几个小时了:(

Joh*_*ohn 7

哦天哪我想通了!firebase 函数正常设置“set-cookie”标头。这个问题有两个方面:

  1. 与 firebase 功能关联的域是 google 域。您无法为其他域设置函数(这是浏览器限制),因此托管函数无法为 localhost 设置 cookie。它也无法为您的应用程序域设置 cookie(该域不同于与该功能关联的域)。您需要在您自己的域下为该函数添加别名,以便能够为您自己的域设置 cookie(但这对开发没有帮助)。请参阅此问题:https ://stackoverflow.com/a/51461847/5490505 。

  2. 真的让我很恼火,如果响应是由另一个域发送的,Google Chrome (v71) 会自动隐藏响应中的“set-cookie”标头。如果您尝试为应用程序的域设置 cookie,在这种情况下,由于浏览器限制,无论如何都不会设置 cookie。但是,如果您没有指定 cookie 的域,则会为与该功能关联的域设置 cookie 但 Google Chrome 不会向您显示标头,并且您不知道它已设置,除非您检查浏览器保存的饼干。这也使得标头甚至没有包含在响应中(实际上)。我认为云功能正在剥离“set-cookie”标头,而实际上Google Chrome正在剥离“set-cookie”标头。我真的不喜欢这个设计决定。这使得调试变得非常困难,我在这个问题上浪费了很多时间。Firefox 的行为符合预期,向您显示“set-cookie”标头。

我还要指出的是,出于我的目的,firebase 函数正在设置一个只能由其他函数读取的secure, , cookie。httponly在这种情况下,将 cookie 的域设置为与函数关联的域是完全可以的(我的客户端应用程序无论如何都不会查看 cookie)。因此,即使 Chrome 没有显示“set-cookie”标头,cookie 也会被设置并且一切正常。Chrome 的设计决策如此糟糕的另一个原因。