簡體   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