保護您的 Firebase ML Android 應用的 Cloud 憑據

如果您的 Android 應用使用 Firebase ML 的雲 API 之一,那麼在您將應用啟動到生產環境之前,您應該採取一些額外的步驟來防止未經授權的 API 訪問。

對於您的生產應用程序,您將確保只有經過身份驗證的客戶端才能訪問云服務。 (請注意,只有非 root 設備才能使用所述方法進行身份驗證。)

然後,您將創建一個僅用於調試的 API 密鑰,以便在測試和開發期間使用該密鑰。

1. 向 Firebase 註冊您的生產應用

首先,向 Firebase 註冊您的生產應用。

  1. 確保您擁有應用的 SHA-1 簽名。請參閱驗證您的客戶端以了解如何操作。

  2. 轉到 Firebase 控制台中的項目設置,然後選擇設置選項卡。

  3. 向下滾動到您的應用卡片,然後選擇您的 Android 應用。

  4. 將應用的 SHA-1 簽名添加到應用的信息中。

2. 限制 API 密鑰的範圍

接下來,配置您現有的 API 密鑰以禁止訪問 Cloud Vision API:

  1. 打開 Google Cloud Console 的憑據頁面。出現提示時,選擇您的項目。

  2. 對於列表中的每個現有 API 密鑰,打開編輯視圖。

  3. API 限制部分,選擇Restrict key ,然後將您希望 API 密鑰有權訪問的所有 API 添加到列表中。確保包含 Cloud Vision API。

    當您配置 API 密鑰的API 限制時,您明確聲明了該密鑰可以訪問的 API。默認情況下,當API 限制部分選擇了不限制密鑰時,API 密鑰可用於訪問為項目啟用的任何 API。

現在,您現有的 API 密鑰將不會授予對雲 ML 服務的訪問權限,但每個密鑰將繼續適用於您添加到其API 限制列表中的任何 API。

請注意,如果您將來啟用任何其他 API,則必須將它們添加到適用 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 清單文件並從目標源集中選擇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 功能時準備啟動應用的信息,請參閱啟動清單