仅设置 set-cookie header 中的第一个 cookie(在 Firebase 托管重写功能后)

Only first cookie in set-cookie header is set (after Firebase hosting rewrites to function)

我正在尝试从 express 节点 back-end 的单个响应中发送多个 cookie。 Set-cookie header 设置了看似有效的值,但 none 的 cookie 除了第一个被存储。这可能是什么原因造成的?有没有可能其他一些 header 正在以某种方式干扰?

app.post("/api/test", function(req, res) {
    res.cookie("age", "44");
    res.cookie("name", "ok");
    res.cookie("something", "else");
    res.send("cookies set");
});

结果 headers

Access-Control-Allow-Credentials: true
Cache-Control: private
Content-Type: text/html; charset=utf-8
Etag: W/"b-AindM8n+eJQTR6jb7Hg8S4fG8qI"
Expires: Sat, 05 Oct 2019 16:18:12 GMT
Function-Execution-Id: r7d6qjgl5noi
Server: Google Frontend
X-Cloud-Trace-Context: 051139bdc4cc753cad51c0dd3e89e0b8;o=1
X-Powered-By: Express
Content-Length: 11
Accept-Ranges: bytes
Date: Sat, 05 Oct 2019 16:18:12 GMT
Connection: keep-alive
Set-Cookie: age=44; path=/,name=ok; path=/,something=else; path=/
X-Served-By: cache-ams21036-AMS
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1570292292.302186,VS0,VE410
Vary: Origin,cookie,need-authorization, x-fh-requested-host, accept-encoding

我希望这会在浏览器中存储 3 个 cookie,但总是只保存第一个。

编辑:

经过进一步调查,set-cookie header 被写为逗号分隔 one-liner 的原因最终被 Firebase 托管以重写函数。

{
   "source": "/{,/**}",
   "function": "testingexpress"
}

似乎某些版本的 express 可能会生成无效的或至少经常不兼容的 cookie headers (syntax of a cookie header, RFC 6265),其中多个 cookie 出现一个 Set-Cookie header。更标准的方法是在响应中提供多个 Set-Cookie header。

值得注意的是,从上面的RFC,也是这个excerpt:

Origin servers SHOULD NOT fold multiple Set-Cookie header fields into a single header field. The usual mechanism for folding HTTP headers fields (i.e., as defined in [RFC2616]) might change the semantics of the Set-Cookie header field because the %x2C (",") character is used by Set-Cookie in a way that conflicts with such folding.

此文档记录了一个可能的解决方法,并且来自 2014 年左右:http://www.connecto.io/blog/nodejs-express-how-to-set-multiple-cookies-in-the-same-response-object/

我无法用 express 4.17.1 复制它(类似的代码生成多个 Set-Cookie headers)。看起来行为可能在 4.13.0 左右发生了变化:https://github.com/expressjs/express/commit/5915894af3f14e75dd3121fdc2d92ae55206e398

我会考虑更新您的 Express 版本,或者使用上述链接文章中的解决方法。

经过进一步调查,set-cookie header 被写成逗号分隔的原因 one-liner 最终被 Firebase 托管以重写函数。已报告为错误。