firebase 云函数不会存储名为“__session”以外的 cookie

IT技术 javascript firebase cookies google-cloud-functions firebase-hosting
2021-02-11 01:49:24

我遵循了authorized-https-endpoint的示例,只添加了console.log来打印req.cookies,问题是cookies总是空的{}我使用客户端JS调用设置cookies并且它们确实保存但由于某种原因,我可以不要让他们在服务器端。

这是 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);

存储饼干:

curl http://FUNCTION_URL/hello --cookie "__session=bar" // req.cookies = {__session: bar}

不存储:

curl http://FUNCTION_URL/hello --cookie "foo=bar" // req.cookies = {}

4个回答

如果您使用 Firebase Hosting + Cloud Functions,这__session是您设计的唯一可以存储的 cookie。这对于我们能够有效地在 CDN 上缓存内容是必要的——我们从请求中去除除__session. 这应该记录在案,但似乎不是(oop!)。我们将更新文档以反映此限制。

此外,您需要将 Cache-Control Header 设置为私有

res.setHeader('Cache-Control', 'private');
还值得注意的是,当使用firebase serve.
2021-03-22 01:49:24
是的,但您通常也需要从服务器端访问 cookie。我得到了缓存限制,但最好在firebase.json配置文件或其他内容中声明您拥有的 cookie 名称,这样您就可以拥有多个。
2021-03-23 01:49:24
注意:您可以使用 Cloud Functions 设置 cookie,并且您可以毫无问题地在客户端 JavaScript 中设置和检索它们只有您被限制在服务器__session它不应影响分析、广告等。
2021-03-29 01:49:24
FWIW,__session即使在本地服务时,我也必须将我的 cookie 名称重命名为并设置缓存控制。否则它对我不起作用。
2021-03-30 01:49:24
2021-04-05 01:49:24

哇,这花了我 2 天的调试时间。记录在案(在 Hosting > Serve dynamic content and host microservices > Manage cache behavior 下,但不在我认为有用的地方——它位于“使用 Cookies”的最底部)。他们提供的Manage Session Cookies上的示例代码使用 cookie 名称,session而不是__session在我的情况下,这是导致我出现此问题的原因。

不确定这是否特定于仅通过云功能提供的 Express.js,但这是我的用例。最令人沮丧的部分是,当使用firebase serve缓存在本地进行测试时,它没有考虑在内,所以它工作得很好。

同样......调试了两天。我无法使用此方法使其在本地工作,因为它与连接到实时服务器的 localhost 完全不同(我必须使用模拟器来提供该功能),但它适用于 Firebase 托管服务器。都好。
2021-03-15 01:49:24
自 2 天前以来,我面临同样的错误。它对我有用,因为我的 cookie 被命名为“accessToken”。太感谢了。
2021-03-21 01:49:24
只想在这里添加我 2 天的调试时间。
2021-03-22 01:49:24
在那里为我调试了一天,但也请把它算作 2 天。
2021-03-23 01:49:24
云产品需要的是一个名为Potential Dealbreakers的页面我花了 5 天时间阅读(和重写)文档,因为我学到了在选择云服务时的艰难方法,阅读每一行至关重要,因为任何地方都可能出现完全破坏交易的情况。但如果我没有对这些文档着迷的话,我可能会在失败的 Azure 到 Firebase 迁移中节省几个月的时间。
2021-04-08 01:49:24

上面的答案和命名约定仍然有效吗?我似乎无法将任何 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 或命名约定的任何内容。

卡梅伦 - 谢谢。我错误地认为云函数 api 会为每个请求自动解析和填充 request.cookies。在您发表评论之前,我没有使用 express/cookie-parser 实现。快速更改后,现在可以使用了。云函数文档应明确说明 request.cookies 不会自动填充。感谢您的答复。
2021-03-15 01:49:24
嗨,杰克,您能否也分享一下您的代码为中间件(app.use()语句)所做的工作您可能没有包含 cookie 解析器中间件。
2021-03-31 01:49:24

与其尝试req.cookies不如使用req.headers.cookie. 您将不得不手动处理 cookie 字符串,但至少您不需要实现 express cookie 解析器,如果这对您来说是个问题的话。