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 解析器,如果这对您来说是个问题。
我按照 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 解析器,如果这对您来说是个问题。