使用 App Check 保护您的 API 密钥

Firebase App Check 会屏蔽来自合法应用以外来源的流量,从而保护应用对 Google Maps Platform 的调用。为此,它会检查来自 reCAPTCHA Enterprise 等认证提供程序的令牌。将应用与 App Check 集成有助于防范恶意请求,以免您因未经授权的 API 调用而被收费。

App Check 是否适合我?

在大多数情况下,我们建议使用 App Check,但在以下情况下不需要或不支持使用 App Check:

  • 非公开或实验性应用。如果您的应用不对公众开放,则无需进行应用检查。
  • 如果您的应用仅用于服务器到服务器通信,则无需进行应用检查。不过,如果与 GMP 通信的服务器由公共客户端(例如移动应用)使用,请考虑使用 App Check 保护该服务器,而不是 GMP。

实现步骤概览

概括来讲,您需要按照以下步骤将应用与 App Check 集成:

  1. 将 Firebase 添加到您的应用。
  2. 添加并初始化 App Check 库。
  3. 将令牌提供程序添加到您的应用。
  4. 初始化 Maps JS 和 App Check API。
  5. 启用调试。
  6. 监控应用请求并决定是否强制执行。

集成 App Check 后,您将能够在 Firebase 控制台中查看后端流量指标。这些指标按请求是否附带有效的 App Check 令牌对请求进行细分。如需了解详情,请参阅 Firebase App Check 文档

当您确定大多数请求都来自合法来源,并且用户已更新到包含 App Check 实现的最新版应用后,就可以开启强制执行。强制执行启用后,App Check 会拒绝所有没有有效 App Check 令牌的流量。

规划 App Check 集成时的注意事项

在规划集成时,请考虑以下事项:

  • 我们建议您使用 reCAPTCHA Enterprise 进行认证,如果每月评估次数超过 1 万次,则需要付费。

    我们推荐的另一个认证提供程序 reCAPTCHA v3 设有配额,超出配额后系统将不会对流量进行评估。

    您可以选择使用自定义认证提供程序,但这是一种高级用例。如需了解详情,请参阅 App Check 文档

  • 您的应用用户在启动时会遇到一些延迟。不过,之后,所有定期重新证明都将在后台进行,用户应该不会再遇到任何延迟。启动时的确切延迟时间取决于您选择的认证提供程序。

    App Check 令牌的有效时长(存活时间或 TTL)决定了重新证明的频率。您可以在 Firebase 控制台中配置此时长。当 TTL 时长约过半时,系统会进行重新证明。如需了解详情,请参阅适用于您的认证提供程序的 Firebase 文档

将您的应用与 App Check 集成

前提条件和要求

第 1 步:将 Firebase 添加到您的应用

按照 Firebase 开发者文档中的说明将 Firebase 添加到您的应用。

第 2 步:添加 App Check 库并初始化 App Check

Firebase 提供了针对每个默认认证提供程序的说明。这些说明介绍了如何设置 Firebase 项目并将 App Check 库添加到您的应用。请按照提供的代码示例初始化 App Check。

第 3 步:加载 Maps JS API 库

  1. 加载核心库和 Google 地图库,如以下代码段所示。如需了解详情和相关说明,请参阅 Maps JavaScript API 文档

    async function init() {
      const {Settings} = await google.maps.importLibrary('core');
      const {Map} = await google.maps.importLibrary('maps');
    }  

第 4 步:初始化 Google 地图和 App Check API

  1. 使用 Firebase 控制台提供的配置初始化 App Check。
  2. 确保向 Maps JS API 发出的请求附带 App Check 令牌:
      import {initializeApp} from 'firebase/app';
      import {
        getToken,
        initializeAppCheck,
        ReCaptchaEnterpriseProvider,
      } from 'firebase/app-check';
        
      async function init() {
        const {Settings} = await google.maps.importLibrary('core');
        const {Map} = await google.maps.importLibrary('maps');
      
        const app = initializeApp({
          // Your firebase configuration object
        });
      
        // Pass your reCAPTCHA Enterprise site key to initializeAppCheck().
        const appCheck = initializeAppCheck(app, {
          provider: new ReCaptchaEnterpriseProvider(
            'abcdefghijklmnopqrstuvwxy-1234567890abcd',
          ),
      
          // Optional argument. If true, the SDK automatically refreshes App Check
          // tokens as needed.
          isTokenAutoRefreshEnabled: true,
        });
      
        Settings.getInstance().fetchAppCheckToken = () =>
            getToken(appCheck, /* forceRefresh = */ false);
      
        // Load a map
        map = new Map(document.getElementById("map"), {
          center: { lat: 37.4161493, lng: -122.0812166 },
          zoom: 8,
        });
      }  
      

第 5 步:启用调试(可选)

如果您想在本地开发和测试应用,或在持续集成 (CI) 环境中运行应用,则可以创建应用的调试 build,该 build 使用调试密钥来获取有效的 App Check 令牌。这样,您就可以避免在调试 build 中使用真实的认证提供程序。

如需在本地测试应用,请执行以下操作:

  • 启用调试提供程序以进行开发。
  • 您将从 SDK 的调试日志中收到自动生成的随机 UUID4(在 App Check 文档中称为“调试令牌”)。将此令牌添加到 Firebase 控制台。
  • 如需了解详情和相关说明,请参阅 App Check 文档

如需在 CI 环境中运行应用,请执行以下操作:

  • 在 Firebase 控制台中生成一个随机 UUID4。
  • 将 UUID4 添加为调试令牌,然后将其复制到 CI 测试在每次运行测试时都会访问的密钥库中。
  • 如需了解详情和相关说明,请参阅 App Check 文档

第 6 步:监控应用请求并决定是否强制执行

在开始强制执行之前,您需要确保不会干扰应用的合法用户。为此,请访问 App Check 指标页面,查看应用流量中经过验证、已过时或非法的流量所占的百分比。当您发现大部分流量均已验证后,就可以启用违规处置功能。

如需了解详情和相关说明,请参阅 Firebase App Check 文档