3

我有一个托管在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 端点的访问,但它仍然允许快速调用该函数,因此可能会增加费用。

我很感激任何建议!

4

1 回答 1

1

Firebaser 在这里

这是一个很好的问题!Doug 已经在上面提出了一些重要的观点,我只是补充说 App Check 令牌上的 TTL 减少了您在第一个要点中观察到的重播窗口,并且此 TTL 是可配置的。

reCAPTCHA v3 的默认 TTL 为 1 天,以防止配额用完,但您可以设置更短的 TTL 以增加尝试设置重放攻击的攻击者的成本。但请注意文档中描述的相关权衡。您可以在此处阅读相关的配额和限制。

不幸的是,从 Firebase 托管重定向的 Web 应用程序无法连接到 GCP 内部网络。App Check 实际上正是您在这种情况下所寻找的。

最后,因为我们一直在努力改进 App Check 平台,所以您在此处留下的评论对我们很有价值,因为我们决定下一步要开发哪些反滥用功能。

于 2021-09-22T22:19:39.947 回答