You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Callable Function 如何限制允许跨域请求的指定来源

Firebase Callable Functions 限制指定CORS来源的配置方法

Firebase Callable Functions默认会自动处理CORS逻辑,回显请求的Origin头作为Access-Control-Allow-Origin的值,导致所有跨域请求都能通过校验。要限制仅指定来源可访问,可按以下方案配置:


配置步骤

  • 第一步:提前定义允许访问的域名白名单
  • 第二步:在函数执行逻辑前校验请求来源,不符合要求直接拦截,符合要求则手动指定CORS响应头覆盖默认配置

代码示例(Node.js环境)

使用onCall封装方法的实现

const functions = require("firebase-functions");

// 定义允许的来源白名单,可根据业务需求修改
const ALLOWED_ORIGINS = [
  "https://foo.example.com",
  "https://your-official-site.com"
];

exports.callFunctionName = functions.https.onCall((data, context) => {
  const requestOrigin = context.rawRequest.headers.origin;
  // 校验来源是否在白名单中
  if (!ALLOWED_ORIGINS.includes(requestOrigin)) {
    throw new functions.https.HttpsError(
      "permission-denied",
      "Cross-origin request not allowed"
    );
  }

  // 手动设置CORS响应头,覆盖默认回显逻辑
  context.rawRequest.res.set("Access-Control-Allow-Origin", requestOrigin);
  // 配置Vary头避免缓存冲突
  context.rawRequest.res.set("Vary", "Origin");

  // 以下为正常业务逻辑
  return {
    status: "success",
    data: "your business response"
  };
});

如需完全自主控制OPTIONS预检请求,可改用onRequest方法实现

const functions = require("firebase-functions");

const ALLOWED_ORIGINS = ["https://foo.example.com"];

exports.callFunctionName = functions.https.onRequest((req, res) => {
  const requestOrigin = req.headers.origin;
  // 拦截不在白名单内的来源
  if (!ALLOWED_ORIGINS.includes(requestOrigin)) {
    return res.status(403).send("Origin not allowed");
  }

  // 处理OPTIONS预检请求
  if (req.method === "OPTIONS") {
    res.set("Access-Control-Allow-Origin", requestOrigin);
    res.set("Access-Control-Allow-Methods", "POST");
    res.set("Access-Control-Allow-Headers", "Authorization, Content-Type");
    res.set("Vary", "Origin");
    return res.status(204).send();
  }

  // 处理正常POST请求
  res.set("Access-Control-Allow-Origin", requestOrigin);
  res.set("Vary", "Origin");

  // 以下为正常业务逻辑
  res.status(200).send({
    status: "success",
    data: "your business response"
  });
});

注意事项

  • 白名单域名建议存放在云函数环境变量中,避免硬编码,方便后续迭代修改
  • 必须配置Vary: Origin响应头,否则浏览器或CDN缓存可能导致正常来源的请求被错误拦截

内容的提问来源于stack exchange,提问作者Johnny Oshika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:06:01