firebase云功能不会存储名为"__session"的cookie

Sag*_*fek 15 javascript cookies firebase firebase-hosting google-cloud-functions

我按照授权的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);
Run Code Online (Sandbox Code Playgroud)

商店cookie:

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

不存储:

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

Mic*_*igh 30

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

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

res.setHeader('Cache-Control', 'private');
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是通常您也需要从服务器端访问cookie。我得到了缓存限制,但是最好声明您在`firebase.json`配置文件中拥有的cookie名称,这样您就可以拥有多个cookie名称。 (3认同)
  • 注意:您可以使用 Cloud Functions 设置 cookie,并且可以在客户端 JavaScript 中设置和检索它们,不会出现任何问题。只有*在服务器上*您才被限制为“__session”。它不应该影响分析、广告等。 (2认同)
  • 还值得注意的是,当使用“firebase serve”在本地提供 firebase 功能时,此限制不适用。 (2认同)
  • FWIW,我必须将我的cookie名称重命名为`__session`并设置缓存控制,即使在本地服务时也是如此.否则它对我不起作用. (2认同)
  • @restInPieces 文档现在位于 https://firebase.google.com/docs/hosting/manage-cache#using_cookies (2认同)

ehe*_*hed 10

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

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

  • 同样...调试了两天。我无法使用此方法让它在本地工作,因为它是一个与连接到实时服务器的本地主机完全不同的域(我必须使用模拟器来提供该功能),但它可以在 Firebase 托管服务器上工作。都好。 (4认同)
  • 我在那里调试了一天,但也请算作两天。 (3认同)
  • 只是想在这里添加我 2 天的调试。 (2认同)