Umu*_*ngo 2 cookies firebase firebase-hosting google-cloud-functions
我有两个云函数,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);
Run Code Online (Sandbox Code Playgroud)
当用户重定向到 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"
}
]
}
Run Code Online (Sandbox Code Playgroud)
身份验证方面工作正常 - 授权重定向 URI 等均已提前更改,它过去重定向到 us-central1-[appName].cloudfunctions.net,现在重定向到我的自定义域。到 youtubeToken 的重定向正常 - 我的浏览器 URL 显示我的自定义域。
如果我将所有内容恢复为使用 us-central1-[appName].cloudfunctions.net 函数地址,则一切正常。在 devtools 中检查 cookie 表明 cookie 的设置符合我的预期。如果我用我的自定义域运行它,cookies 也在那里......除了函数本身无法找到它们。
似乎在 URL 重写发生之前以某种方式检查 cookie,但失败了?真的很难找到解决方案!
console.log(req.get('host'))我以为我在 youtubeToken 返回时发现了确凿的证据us-central1-[appName].cloudfunctions.net,但是将它放在 youtubeRedirect 中却得到了相同的结果,所以这让我更加困惑......
在另一个问题中找到了答案
当 Firebase Hosting 与 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 });
Run Code Online (Sandbox Code Playgroud)
然后在 youtubeToken 中检索它
const sessionCookie = JSON.parse(req.cookies.__session)
if (!sessionCookie.state) {
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
527 次 |
| 最近记录: |