【问题标题】:firebase function url rewrite breaking cookiesfirebase 函数 url 重写破坏 cookie
【发布时间】:2021-07-27 21:33:25
【问题描述】:

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

youtubeRedirect 将用户带到谷歌身份验证屏幕,并提供对 youtube 令牌功能的重定向。它设置了这两个 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,并且失败了?真的很难找到解决方案!

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

【问题讨论】:

    标签: firebase cookies google-cloud-functions firebase-hosting


    【解决方案1】:

    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) {
    

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 2011-04-06
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 2012-02-27
      • 2018-12-24
      • 1970-01-01
      相关资源
      最近更新 更多