【问题标题】:firebase cloud function won't store cookie named other than "__session"firebase 云功能不会存储名为“__session”以外的 cookie
【发布时间】: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 = {}

【问题讨论】:

    标签: javascript firebase cookies google-cloud-functions firebase-hosting


    【解决方案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 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 解析器,如果这对您来说是个问题。

    【讨论】:

      猜你喜欢
      • 2019-12-18
      • 2021-01-12
      • 1970-01-01
      • 2021-10-16
      • 2017-10-09
      • 2019-08-08
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多