使用 App Check 保护您的 API 密钥

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

App Check 是否适合我?

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

  • 您使用的是原始的 Google 地图 SDK。App Check 仅适用于 Places SDK(新版)
  • 非公开或实验性应用。如果您的应用不对公众开放,则无需进行应用检查。
  • 如果您的应用仅用于服务器到服务器通信,则无需进行应用检查。不过,如果与 GMP 通信的服务器由公共客户端(例如移动应用)使用,请考虑使用 App Check 保护该服务器,而不是 GMP。
  • App Check 推荐的证明提供程序无法在被证明提供程序认定为已遭到入侵或不可信的设备上运行。如果您需要支持此类设备,可以部署自定义认证服务。如需了解详情,请参阅说明

实现步骤概览

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

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

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

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

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

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

  • 我们推荐的认证提供程序 Play Integrity 的标准 API 用量层级设有每日调用次数上限。 如需详细了解调用限制,请参阅 Google Play Integrity 开发者文档中的设置页面。

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

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

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

将您的应用与 App Check 集成

前提条件和要求

  • 集成了 4.1 或更高版本的 Places SDK 的应用。
  • 应用的 SHA-256 指纹。
  • 应用的软件包名称。
  • 您必须是 Cloud 控制台中相应应用的所有者。
  • 您需要 Cloud 控制台中应用的项目 ID

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

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

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

如需了解如何使用默认的认证提供程序 Play Integrity,请参阅使用入门:将 App Check 与 Play Integrity 搭配使用 (Android)

  1. 如果您尚未将地点 SDK 集成到您的应用,请先执行此操作。
  2. 接下来,初始化 App CheckPlaces 客户端

    // Initialize App Check
    FirebaseApp.initializeApp(/*context=*/ this);
    FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance();
    firebaseAppCheck.installAppCheckProviderFactory(
            PlayIntegrityAppCheckProviderFactory.getInstance());
      
    // Initialize Places SDK
    Places.initializeWithNewPlacesApiEnabled(context, API_KEY);
    PlacesClient client = Places.createClient(context);.

第 3 步:添加令牌提供程序

初始化 Places API 后,调用 setPlacesAppCheckTokenProvider() 以设置 PlacesAppCheckTokenProvider

Places.initializeWithNewPlacesApiEnabled(context, API_KEY);
Places.setPlacesAppCheckTokenProvider(new TokenProvider());
PlacesClient client = Places.createClient(context);.

下面是令牌提取器接口的实现示例:

  /** Sample client implementation of App Check token fetcher interface. */
  static class TokenProvider implements PlacesAppCheckTokenProvider {
    @Override
    public ListenableFuture<String> fetchAppCheckToken() {
      SettableFuture<String> future = SettableFuture.create();
      FirebaseAppCheck.getInstance()
          .getAppCheckToken(false)
          .addOnSuccessListener(
              appCheckToken -> {
                future.set(appCheckToken.getToken());
              })
          .addOnFailureListener(
              ex -> {
                future.setException(ex);
              });

      return future;
    }
  }

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

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

如需在模拟器或测试设备上运行应用,请执行以下操作:

  • 将 App Check 库添加到您的 build.gradle 文件中。
  • 在调试 build 中,将 App Check 配置为使用调试提供程序工厂。
  • 启动应用,系统会创建一个本地调试令牌。将此令牌添加到 Firebase 控制台。
  • 如需了解详情和相关说明,请参阅 App Check 文档

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

  • 在 Firebase 控制台中创建一个调试令牌,并将其添加到 CI 系统的安全密钥库。
  • 将 App Check 库添加到您的 build.gradle 文件中。
  • 将 CI build 变体配置为使用调试令牌。
  • 使用 DebugAppCheckTestHelper 封装测试类中需要 App Check 令牌的代码。
  • 如需了解详情和相关说明,请参阅 App Check 文档

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

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

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