保護 Firebase ML Android 應用程式和#39 的雲端憑證

如果您的 Android 應用程式使用 Firebase ML 的其中一個雲端 API,請在正式環境中啟動應用程式前,採取額外步驟防範未經授權的 API 存取活動。

對於正式版應用程式,您必須確保只有經過驗證的用戶端才能存取雲端服務。(請注意,只有未解鎖的裝置可以使用上述方法進行驗證)。

接著,您將建立僅供偵錯的 API 金鑰,方便您在測試和開發期間使用。

1. 透過 Firebase 註冊正式版應用程式

首先,請透過 Firebase 註冊正式版應用程式。

  1. 請確認您已取得應用程式的 SHA-1 簽名。如要瞭解如何操作,請參閱「驗證用戶端」一文。

  2. 前往 Firebase 主控台中的「Project settings」,然後選取「Settings」分頁。

  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 限制」專區已選取「Don't restrict key」,則可使用 API 金鑰存取專案已啟用的任何 API。

現有的 API 金鑰將無法授予雲端 ML 服務存取權,但每個金鑰仍可繼續支援您已加入 API 限制清單的任何 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. 如果您還沒有偵錯資訊清單,請依序點選「File」>「New」>「Other」>「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 金鑰 (偵錯金鑰):

    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 功能時,準備應用程式以便啟動,請參閱啟動檢查清單