Firebase Web SDK 对所有 httpsCallable 请求使用自定义域

Firebase web SDK using custom domain for all httpsCallable requests

我们有一个使用 Firebase 后端的 React 应用程序。我们的一些大客户发现他们的网络安全会阻止对某些 URLs 的调用,其中 SSL 证书可能有问题。一个经常被阻止的 URL 是 cloudfunctions.net,它被 Firebase Cloud Functions 用作默认的云函数端点。

我们不需要要求每个潜在客户更新他们的网络安全和白名单 cloudfunctions.net,而是需要一个更强大的解决方案,使我们能够使用专用 SSL 证书在我们的自定义域中托管云功能。这个解决方案的大部分应该通过创建一个 GCP 静态 IP 地址来处理,并使用 GCP 负载均衡器将对该 IP 地址的调用重新路由到我们的云功能。

SO 上有很多关于使用 Firebase 托管将对自定义域的调用重新路由到云功能的文章,例如

没有清楚记录的是如何在使用 functions().httpsCallable 作为 firebase.functions() 的一部分时为您自己的 React 客户端初始化 firebase-js SDK 以调用自定义域。

当使用 httpsCallable 从我们的 Web 应用向云函数发出请求时:

const { data } = firebase.functions().httpsCallable('myFunction');

默认的 SDK 行为发出请求:

https://<region>-<firebase-project-id>.cloudfunctions.net/myFunction

官方文档含糊地提到了 initializing Firebase Functions with a region variable. They also share how to do this when initializing the client SDK here

const functions = firebase().app().functions('region-string');

我想要实现的是更改 firebase-js SDK 的默认行为,以便在我的 React 客户端中调用云函数时,这些请求将调用我的自定义域(我使用的是 GCP 负载均衡器为云功能提供自定义域端点)。

事实证明,您可以使用 区域 自定义域的配置来提供 firebase-js SDK 功能。这显示在 SDK code repository here.

因此,为确保您的客户端始终对您的自定义域进行 httpsCallable 事务,您可以像这样初始化 Firebase 函数:

firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  projectId: '### CLOUD FUNCTIONS PROJECT ID ###'
  databaseURL: 'https://### YOUR DATABASE NAME ###.firebaseio.com',
});

// Initialize Cloud Functions through Firebase
const functions = firebase.app().functions('https://customdomain.com/');

注意:此解决方案还要求您配置 DNS 配置以将您的自定义域重定向到 GCP 负载均衡器。将负载均衡器与 urlMap 结合使用时,您可以将对 https://customdomain.com/myFunction 的调用路由到 myFunction 云函数。

完整的交易如下:

客户端 SDK -> httpsCallable -> 自定义域 -> GCP 静态 IP -> GCP Load Balancer -> GCP urlMap -> GCP 云函数后端网络组 -> 云函数。

您可以在此处找到配置 GCP 负载平衡器和无服务器 NEG 的说明:https://cloud.google.com/load-balancing/docs/https/setting-up-https-serverless#cloud-functions

我希望这可以节省其他人的搜索量。我很惊讶我需要阅读 firebase-sdk 代码才能找到答案。