首页 > 解决方案 > firebase 函数 url 重写破坏 cookie

问题描述

我有两个云功能,youtubeRedirect 和 youtubeToken。在进行 URL 重写之前(如在此处找到https://firebase.google.com/docs/hosting/functions),一切正常。

youtubeRedirect 将用户带到 google auth 屏幕,并提供对 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 已按我的预期设置。如果我用我的自定义域运行它,cookie 也在那里......除了函数本身找不到它们。

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

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

标签: firebasecookiesgoogle-cloud-functionsfirebase-hosting

解决方案


在另一个问题中找到了答案

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

资源

我的解决方案是在 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) {

推荐阅读