【问题标题】:Firebase https function unexpectedly strips `set-cookie` headerFirebase https 函数意外剥离`set-cookie` 标头
【发布时间】:2019-07-03 22:41:26
【问题描述】:

作为(间接)mentioned in the firebase functions docs,假设 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。

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

【问题讨论】:

  • 您是否将 Cloud Functions 与 Firebase 托管一起使用。因为在这种情况下,这是预期的行为。见stackoverflow.com/questions/44929653/…
  • @FrankvanPuffelen 阅读了那篇文章后,我仍然不确定“具有云功能的 Firebase 托管”是什么意思。我对 firebase 托管的理解是它是针对静态内容的,所以我不确定托管服务如何与云功能交互。目前,我的代码由开发服务器在本地提供。客户端正在通过 javascript 调用 functions.https.onRequest() 函数。所以我要说不,我没有使用带有云功能的 Firebase 托管。 (尽管最终,我希望 SPA 将通过 firebase 托管存储)谢谢。
  • @FrankvanPuffelen 为了更好的衡量标准,我尝试按照该帖子中的建议将'Cache-Control' 设置为'private',并将cookie 名称更改为__session。虽然在对客户端的响应中设置了 Cache-Control 标头,但仍然缺少 set-cookie 标头。
  • @FrankvanPuffelen 我终于解决了这个问题!再次感谢您的帮助!
  • 很高兴听到约翰的消息!感谢您的自我回答,因为这对于将来遇到此问题的人可能非常有用。

标签: firebase cookies google-cloud-functions


【解决方案1】:

天哪,我想通了! 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 不会向您显示标题,您也不知道它是设置,除非您检查浏览器保存的 cookie。这也给出了标头甚至没有包含在响应中的外观,当它包含时。我认为云功能正在剥离“set-cookie”标头,而实际上 Google Chrome 正在剥离“set-cookie”标头。我真的不喜欢这个设计决定。它使调试 SO 变得困难,我在这个问题上浪费了很多时间。 Firefox 的行为符合预期,向您显示“set-cookie”标头。

我还要注意,就我的目的而言,firebase 函数正在设置一个 securehttponly cookie,它只能由其他函数读取。在这种情况下,让 cookie 的域成为与函数关联的域是完全可以的(我的客户端应用程序从不查看 cookie)。因此,即使 Chrome 没有显示“set-cookie”标头,cookie 也会被设置,一切正常。 Chrome 的设计决定如此、如此糟糕的另一个原因。

【讨论】:

    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多