firebase 函数 url 重写破坏 cookie

问题描述

我有两个云函数,youtubeRedirect 和 youtubetoken。在进行 URL 重写之前(如此处 https://firebase.google.com/docs/hosting/functions 所见),一切正常。

youtubeRedirect 将用户带到 google 身份验证屏幕,并提供对 youtubetoken 函数重定向。它设置了这两个cookie

res.cookie('state',state.toString(),{ maxAge: 3600000,secure: true,httpOnly: true });
res.cookie('UID',req.query.uid);

用户重定向到youtubetoken时,会检查cookie值; if (!req.cookies.state) {throw new Error('State cookie not set or expired.');}

为我的自定义域使用 URL 重写时,此时失败,因为 req.cookies 为空。当我在 Chrome 中检查我的 cookie 时,我可以看到已经为我的自定义域设置了 cookie。我在 firebase.json 文件中重写了 youtubeRedirect 和 youtubetoken

"hosting": {
    "public": "api","ignore": [
      "firebase.json","**/.*","**/node_modules/**"
    ],"rewrites": [
      {
        "source": "/youtubeRedirect","function": "youtubeRedirect"
      },{
        "source": "/youtubetoken","function": "youtubetoken"
      }
    ]
  }

事情的身份验证方面工作正常 - 授权重定向 URI 等都事先更改,它曾经重定向到 us-central1-[appName].cloudfunctions.net 现在重定向到我的自定义域。重定向到 youtubetoken 工作正常 - 我的浏览器 URL 显示我的自定义域。

如果我将所有内容恢复为使用 us-central1-[appName].cloudfunctions.net 函数地址,则一切正常。检查 devtools 中的 cookie 显示 cookie 已按照我的预期设置。如果我用我的自定义域运行它,cookies 也在那里......除了函数本身找不到它们。

似乎是在 URL 重写发生之前以某种方式检查了 cookie,并且失败了?真的很难找到解决方案!

当 youtubetoken 中的 console.log(req.get('host')) 返回 us-central1-[appName].cloudfunctions.net 时,我以为我找到了确凿的证据,但是将它放在 youtubeRedirect 中具有相同的结果,所以让我更加困惑...

解决方法

another question中找到答案

将 Firebase 托管与 Cloud Functions 或 Cloud Run 一起使用时,通常会从传入请求中去除 Cookie。这是允许有效的 CDN 缓存行为所必需的。只有特别命名的 __session cookie 被允许传递到您的应用程序的执行中。

Source

我的解决方案是在 youtubeRedirect 中像这样设置 cookie

const sessionCookie = {
  state: state.toString(),UID: req.query.uid
}
res.cookie('__session',JSON.stringify(sessionCookie),{ maxAge: 3600000,secure: true,httpOnly: true });

然后在 youtubeToken 中检索它

const sessionCookie = JSON.parse(req.cookies.__session)
if (!sessionCookie.state) {