繁体   English   中英

使用托管重写读取 Firebase GCP 函数中的 cookies

[英]Read cookies in Firebase GCP Functions using Hosting Rewrites

我正在使用 Firebase 函数和 Firebase 托管。 托管将所有流量重定向到我的 function。

请求托管站点(即不是云 function URL)时,请求 cookies 不可用。 有没有办法访问请求 cookies?

我正在将一个网站迁移到 Firebase,并假设我可以遵循基本的 web 原则,即可以访问同域 cookies。

const { runWith } = require('firebase-functions');
const cookieParser = require('cookie-parser');
const express = require('express');
const app = express();
app.use(cookieParser());

function handleRequest(req, res) {
  res.cookie('firebase1', 'test', {});

  if (process.env.HOSTNAME) {
    res.cookie('firebase2', 'test', {
      domain: process.env.HOSTNAME,
    });
  }
  res.cookie('firebase3', 'test', {
    domain: req.hostname,
  });
  return res.json({
    hostname: process.env.HOSTNAME,
    'req.cookies': req.cookies, // always empty
    'req.headers.cookie': req.headers.cookie, // always undefined
  });
}

app.get('*', handleRequest);
app.use(handleRequest);

exports.index = runWith({
  timeoutSeconds: 10,
  memory: '128MB',
}).https.onRequest(app);

firebase.json

{
  "functions": {
    "ignore": [
      "node_modules",
      ".git",
      "firebase-debug.log",
      "firebase-debug.*.log"
    ]
  },
  "hosting": {
    "public": "public",
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
    "rewrites": [
      {
        "source": "**",
        "function": "index"
      }
    ]
  }
}

在此处输入图像描述

我还没有测试过,但Express API 文档表明,由于您使用cookie-parser中间件,您应该执行req.cookies而不是req.headers.cookie

Firebase 支持团队的回答:

当将 Firebase 托管与 Cloud Functions 或 Cloud Run 一起使用时,cookies 通常会从传入请求中剥离。 这对于允许高效的 CDN 缓存行为是必要的。 只有特别命名的 __session cookie 被允许传递给您的应用程序的执行。

如果存在,__session cookie 会自动成为缓存键的一部分,这意味着具有不同 cookies 的两个用户不可能接收到对方的缓存响应。 仅当您的应用根据用户授权提供不同的内容时,才使用 __session cookie。 此外,您需要将 Cache-Control Header 设置为私有 res.setHeader('Cache-Control', 'private')。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM