firebase 云功能不会存储名为“__session”以外的 cookie
Posted
技术标签:
【中文标题】firebase 云功能不会存储名为“__session”以外的 cookie【英文标题】:firebase cloud function won't store cookie named other than "__session" 【发布时间】:2017-12-09 07:47:18 【问题描述】:我遵循authorized-https-endpoint 的示例,只添加了console.log 来打印req.cookies,问题是cookie 总是空的 我使用客户端JS 调用设置cookie,它们确实保存但从一些原因,我无法在服务器端获取它们。
这里是 index.js 的完整代码,和示例完全一样:
'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const express = require('express');
const cookieParser = require('cookie-parser')();
const cors = require('cors')(origin: true);
const app = express();
const validateFirebaseIdToken = (req, res, next) =>
console.log(req.cookies); //// <----- issue this is empty why??
next();
;
app.use(cors);
app.use(cookieParser);
app.use(validateFirebaseIdToken);
app.get('/hello', (req, res) =>
res.send(`Hello!!`);
);
exports.app = functions.https.onRequest(app);
存储 cookie:
curl http://FUNCTION_URL/hello --cookie "__session=bar" // req.cookies =
__session: bar
不存储:
curl http://FUNCTION_URL/hello --cookie "foo=bar" // req.cookies =
【问题讨论】:
【参考方案1】:如果您使用 Firebase Hosting + Cloud Functions,__session
是您设计的唯一可以存储的 cookie。这对于我们能够有效地缓存 CDN 上的内容是必要的——我们从请求中删除除 __session
之外的所有 cookie。这应该记录在案,但似乎没有(哎呀!)。我们将更新文档以反映此限制。
另外,您需要将 Cache-Control Header 设置为私有
res.setHeader('Cache-Control', 'private');
【讨论】:
注意:您可以使用 Cloud Functions 设置 cookie,并且您可以在客户端 javascript 中设置和检索它们,没有任何问题。只有在服务器上,您才被限制为__session
。它不应影响分析、广告等。
是的,但您通常也需要从服务器端访问 cookie。我得到了缓存限制,但最好在firebase.json
配置文件中声明你拥有的cookie名称或其他东西,这样你就可以拥有多个。
现在似乎记录在这里:firebase.google.com/docs/hosting/functions#using_cookies
还值得注意的是,当使用 firebase serve
在本地提供 Firebase 功能时,此限制不适用。
FWIW,我不得不将我的 cookie 名称重命名为 __session
并设置缓存控制,即使在本地服务时也是如此。否则它对我不起作用。【参考方案2】:
哇,这花了我 2 天的调试时间。 记录在案(在“托管”>“服务动态内容和托管微服务”>Manage cache behavior,但不是在我发现有用的地方——它位于“使用 Cookie”的最底部)。他们提供的Manage Session Cookies 上的示例代码使用cookie 名称session
而不是__session
,就我而言,这对我来说是导致这个问题的原因。
不确定这是否特定于仅通过云功能提供的 Express.js,但这是我的用例。最令人沮丧的是,当使用firebase serve
进行本地测试时,缓存并没有考虑在内,所以它工作得很好。
【讨论】:
同...两天调试。我无法使用这种方法在本地工作,因为它是一个与连接到实时服务器的 localhost 完全不同的域(我必须使用模拟器来提供该功能),但它可以在 Firebase 托管服务器上工作。都很好。 只想把我这两天的调试加在这里。 自 2 天前以来我面临同样的错误。它对我有用,因为我的 cookie 被命名为“accessToken”。非常感谢。 我在那里调试了一天,但也请算作 2。 云产品需要的是一个名为Potential Dealbreakers的页面。我花了 5 天时间阅读(和重写)文档,因为我学到了在选择云服务时,阅读每一行是至关重要的,因为总的交易破坏者可以出现在任何地方。但如果我没有沉迷于这些文档,我可能在 Azure 到 Firebase 的失败迁移中节省了几个月的时间。【参考方案3】:上面的答案和命名约定仍然有效吗?我似乎无法将任何 cookie(包括名为“__session”的会话 cookie)传递给云函数。
我设置了一个简单的测试函数,带有适当的 firebase 重写规则:
export const test = functions.https.onRequest((request, response) =>
if (request.cookies)
response.status(200).send(`cookies: $request.cookies`);
else
response.status(200).send('no cookies');
);
每次访问 https://www.xxxcustomdomainxxx.com/test 时都会调用该函数,但 request.cookies 始终未定义,因此返回“无 cookie”。
例如,以下总是返回“无 cookie”:
curl https://www.xxxcustomdomainxxx.com/test --cookie "__session=testing"
即使在验证名为 __session 的会话 cookie 已通过我的身份验证端点正确设置之后,我使用浏览器也会得到相同的行为。此外,上面引用的链接 (https://firebase.google.com/docs/hosting/functions#using_cookies) 不再指定有关 cookie 或命名约定的任何内容。
【讨论】:
嗨,Jack,您能否分享一下您的代码为中间件所做的工作(app.use()
语句)。您可能没有包含 cookie 解析器中间件。
卡梅伦 - 谢谢。我错误地认为云函数 api 会为每个请求自动解析和填充 request.cookies。在您发表评论之前,我没有使用 express/cookie-parser 实现。快速更改后,它现在可以工作了。云功能文档应特别概述 request.cookies 不会自动填充。感谢您的回复。【参考方案4】:
不要尝试req.cookies
,而是使用req.headers.cookie
。您将不得不手动处理 cookie 字符串,但至少您不需要实现 express cookie 解析器,如果这对您来说是个问题。
【讨论】:
以上是关于firebase 云功能不会存储名为“__session”以外的 cookie的主要内容,如果未能解决你的问题,请参考以下文章