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的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 存储没有名为 useStorageEmulator 的导出

如何使用 Firebase 云存储添加图像存储功能?

使用 Firebase 云功能将文件上传到云存储

验证 Firebase 云功能中的存储文件数据

使用 firebase 功能将图像上传到云存储错误

基于 Firestore 数据的 Firebase 云存储规则可以解决