firebase - 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 中具有相同的结果,所以这让我更加困惑......
解决方案
在另一个问题中找到了答案
将 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) {
推荐阅读
- java - Is there any option in order to get more than 10 twitter trending topics with twitter4j?
- elasticsearch - 2 indexes with same alias but only one is marked as write index
- python - Finding XPath without using inspecting element?
- visual-studio-code - How to go back from search panel to the last opened text editor in Visual Studio Code?
- javascript - Why are my divs not moving when I'm pressing .button?
- javascript - React Router v5 accompanied with Code Splitting, and Data Prefetching with the use of Server Side Rendering
- c# - 使用asp.net从数据库中获取图像并显示在网络表单中
- c# - 绑定抽象类模型的简单方法,ASP.Net Core 5
- html - 如何调整 html 以打印 PDF
- ethereum - 处理事务时出现 VM 异常:恢复 TimedCrowdsale:未打开 --