保護您的 Firebase ML Android 應用程式的雲端憑證

如果您的 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 控制台的憑證頁面。出現提示時,選擇您的項目。

  2. 對於清單中的每個現有 API 金鑰,開啟編輯視圖。

  3. API 限制部分中,選擇限制金鑰,然後將您希望 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 控制台的憑證頁面。出現提示時,選擇您的項目。

    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 金鑰(偵錯金鑰):

    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)

    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);

下一步

請參閱啟動清單,以了解有關在使用其他 Firebase 功能時準備啟動應用程式的資訊。