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
相关产品推荐
相关产品推荐

