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

firebase cloud function won't store cookie named other than "__session"

我按照 authorized-https-endpoint 的示例只添加了 console.log 来打印 req.cookies,问题是 cookie 总是空的 {} 我设置 cookie 使用客户端 JS 调用,它们确实保存了,但出于某种原因,我无法在服务器端获取它们。

这里是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 = {}

如果您使用的是 Firebase 托管 + 云功能,__session 是您设计的唯一可以存储的 cookie。这对于我们能够有效地在 CDN 上缓存内容是必要的——我们从请求中删除除 __session 之外的所有 cookie。这应该记录在案,但似乎没有(哎呀!)。我们将更新文档以反映此限制。

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

res.setHeader('Cache-Control', 'private');

上面的答案和命名约定是否仍然有效?我似乎无法传递任何 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 始终未定义,因此返回 'no cookies'。

比如下面总是returns'no cookies':

curl https://www.xxxcustomdomainxxx.com/test --cookie "__session=testing"

即使在验证名为 __session 的会话 cookie 已通过我的身份验证端点正确设置后,我也使用浏览器得到了相同的行为。此外,上面引用的 link (https://firebase.google.com/docs/hosting/functions#using_cookies) 不再指定有关 cookie 或命名约定的任何内容。

哇,这花了我 2 天的调试时间。它 记录在案(在 Hosting > Serve dynamic content and host microservices > Manage cache behavior, but not in a place that I found to be useful -- it is at the very bottom "Using Cookies"). The sample code on Manage Session Cookies 它们提供的使用 cookie 名称 session 而不是 __session 的情况下,在我的情况是导致我出现此问题的原因。

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

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