我有一个托管在Firebase Cloud Functions上的 Node.js API(使用 Express.js 构建)和一个托管在Firebase Hosting上的随附 Web 应用程序,它应该与上述 API 交互。
我想限制对 API 的调用,以便只有 Web 应用程序能够调用云函数。我怎样才能做到这一点?
我试过的:
使用App Check或更准确地说是 Google 的网络应用程序 reCAPTCHA v3。我已将 Web 应用程序的域列入白名单,并且还激活了 App Check 令牌验证服务器端。然而,App Check 的问题是我能够从浏览器获取 reCAPTCHA 证明令牌(在通过 Web 应用程序进行身份验证之后)并将其用于从任何地方发出的请求。这使得从 Web 应用程序外部轰炸 API 成为可能,并首先破坏了使用 App Check 的目的。
这里需要注意的是,在 Cloud Functions 中激活 App Check 的文档说明了
functions.https.onCall()
. 但是,由于我的 API 是使用 Express.js 构建的,因此我必须使用一种变通方法才能按照此处functions.https.onRequest()
的说明使用。从 Google Cloud 控制台限制 Cloud Function 以仅允许同一项目的客户端按照此处的说明调用该函数。不幸的是,我在 Firebase Hosting 上托管的网络应用程序似乎不属于同一个 Google Cloud 项目。在 Firebase Hosting 上托管的应用不会出现在 Google Cloud 控制台中。此外,在将函数的Ingress 设置调整为“仅允许内部流量”后,我在尝试通过 Web 应用程序访问 API 时收到 CORS 错误。不过,我无法从其他任何地方访问 API,这部分是预期的结果。
在有人提议从 API 中限制 CORS 选项中的域之前,虽然这可能用于限制对 API 端点的访问,但它仍然允许快速调用该函数,因此可能会增加费用。
我很感激任何建议!