Google 致力于为黑人社区推动种族平等。查看具体举措

保护 Firebase ML Android 应用的 Cloud 凭据

如果您的 Android 应用使用了 Firebase ML 的云端 API,那么在生产环境中发布该应用之前,应该采取一些额外措施来防止未经授权的 API 访问。

对于您的正式版应用,您应确保只有经过身份验证的客户端才能访问云端服务。(请注意,只有未取得 root 权限的设备才能使用所述方法进行身份验证。)

另外,您要创建一个仅用于调试的 API 密钥,以便在测试和开发期间使用。

1. 在 Firebase 中注册正式版应用

首先,在 Firebase 中注册您的正式版应用。

最快捷的方法是将 Firebase 项目与您的 Google Play 项目相关联。您可以进入 Firebase 控制台并在项目设置的集成部分中执行此操作。

关联项目时,系统会将正式版应用的 SHA-1 签名导入 Firebase 项目,您可以在设置页面中确认。请注意,关联 Firebase 和 Google Play 项目还会授予 Firebase 访问其他 Google Play 数据(包括崩溃和收入统计信息)的权限,同时授予 Google Play 访问 Firebase 数据(包括分析)的权限。

或者,如果您不想在 Firebase 和 Google Play 项目之间共享数据,则可以在“设置”页面上自行指定应用的 SHA-1 签名。如需了解如何获取应用的 SHA-1 签名,请参阅对客户端进行身份验证

2. 限制 API 密钥的范围

接下来,配置现有的 API 密钥以禁止访问 Cloud Vision API:

  1. 打开 Google Cloud Console 中的凭据页面。

  2. 针对列表中的每个 API 密钥,打开修改视图,然后在“密钥限制”部分中,向列表中添加除了 Cloud Vision API 之外的所有 API

3. 创建并使用仅用于调试的 API 密钥

最后,创建一个仅用于开发的新 API 密钥。Firebase ML 可以使用此 API 密钥在无法进行应用身份验证的环境中(例如在模拟器上运行时)访问 Google Cloud 服务。

  1. 创建一个用于开发的新 API 密钥:

    1. 打开 Google Cloud Console 中的凭据页面。
    2. 依次点击创建凭据 > API 密钥,并记下新的 API 密钥。此密钥允许从未经身份验证的应用访问 API,因此请勿泄露此密钥
  2. 如需确保新的调试 API 密钥不会在发布的应用中泄露,请在仅用于调试版本的 Android 清单文件中指定调试 API 密钥:

    1. 如果您还没有调试清单,请创建一个,只需依次点击文件 > 新建 > 其他 > Android 清单文件 (Android Manifest File) 并从目标来源集中选择 debug 即可。

    2. 在调试清单中,添加以下声明:

      <application>
      <meta-data
          android:name="com.firebase.ml.cloud.ApiKeyForDebug"
          android:value="your-debug-api-key" />
      </application>
      
  3. 在您的应用中,配置 Firebase ML 以使用证书指纹匹配来对生产环境中的客户端进行身份验证,并确保只在调试版本中使用 API 密钥(调试密钥):

    Java

    FirebaseVisionCloudImageLabelerOptions.Builder optionsBuilder =
            new FirebaseVisionCloudImageLabelerOptions.Builder();
    if (!BuildConfig.DEBUG) {
        // Requires physical, non-rooted device:
        optionsBuilder.enforceCertFingerprintMatch();
    }
    
    // Set other options. For example:
    optionsBuilder.setConfidenceThreshold(0.8f);
    // ...
    
    // And lastly:
    FirebaseVisionCloudImageLabelerOptions options = optionsBuilder.build();
    FirebaseVision.getInstance().getCloudImageLabeler(options).processImage(myImage);

    Kotlin+KTX

    val optionsBuilder = FirebaseVisionCloudImageLabelerOptions.Builder()
    if (!BuildConfig.DEBUG) {
        // Requires physical, non-rooted device:
        optionsBuilder.enforceCertFingerprintMatch()
    }
    
    // Set other options. For example:
    optionsBuilder.setConfidenceThreshold(0.8f)
    // ...
    
    // And lastly:
    val options = optionsBuilder.build()
    FirebaseVision.getInstance().getCloudImageLabeler(options).processImage(myImage)

后续步骤

如需了解在使用其他 Firebase 功能时的应用发布准备,请参阅发布核对清单