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

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

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

然後,您將創建一個僅用於調試的 API 密鑰,您可以在測試和開發過程中方便地使用它。

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

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

最快的方法是將您的 Firebase 項目與您的 Google Play 項目相關聯。你可以從這樣做集成的項目設置在火力地堡控制台部分。

當你連接你的項目,你的生產應用“SHA-1簽名被導入到你的火力地堡項目,您可以在確認設置頁面。請注意,將您的 Firebase 和 Google Play 項目相關聯還會使 Firebase 可以訪問其他 Google Play 數據(包括崩潰和收入統計信息),以及 Google Play 可以訪問 Firebase 數據(包括分析)。

或者,如果您不想在 Firebase 和 Google Play 項目之間共享數據,您可以在“設置”頁面上自行指定應用的 SHA-1 簽名。請參閱驗證您的客戶端,以了解如何讓你的應用程序“SHA-1簽名。

2. 限制你的 API 密鑰的範圍

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

  1. 打開證書的谷歌雲端控制台的頁面。出現提示時,選擇您的項目。

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

  3. API的限制部分,選擇限制鍵,然後添加到列表中的所有的到你想要的API密鑰來訪問的API。確保包括雲願景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. 打開證書的谷歌雲端控制台的頁面。出現提示時,選擇您的項目。

    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 密鑰(調試密鑰):

    爪哇

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

    科特林+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)

下一步

請參閱發布清單上使用其他火力地堡功能時準備您的應用程序發布的信息。