Firebase https函数意外剥离了“ set-cookie”标头

时间:2019-02-10 05:18:27

标签: firebase cookies google-cloud-functions

作为mentioned in the firebase functions docs(间接)https://github.com/apache/kafka/tree/1.0/streams/examples/src/main/java/org/apache/kafka/streams/examples/pageview,假定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' });
});

奇怪的是,对console.log(response.get('set-cookie'))的调用向我显示了set-cookie头文件已设置在函数调用的那一点。因此,从响应中剥离了set-cookie标头。当然,类似于Firebase函数的似乎实际上并不支持操纵cookie。

有人知道发生了什么吗?我已经尝试了好几个小时了:(

1 个答案:

答案 0 :(得分:1)

我的天哪,我知道了! firebase函数 通常会设置“ set-cookie”标头。问题是双重的:

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

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

我还将注意到,出于我的目的,firebase函数正在设置securehttponly,仅由其他函数读取的cookie。在这种情况下,完全可以将Cookie的域设置为与功能相关联的域(我的客户端应用程序从不看Cookie)。因此,即使Chrome浏览器未显示“ set-cookie”标头,也已设置了cookie,并且一切正常。 Chrome的设计决定之所以如此的另一个原因是 so 不好。