如果您的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:
打開Google Cloud Console的“憑據”頁面。
對於列表中的每個API密鑰,打開編輯視圖,然後在“密鑰限制”部分中,將除Cloud Vision API之外的所有可用API添加到列表中。
3.創建和使用僅調試API密鑰
最後,創建一個僅用於開發的新API密鑰。 Firebase ML可以使用此API密鑰在無法進行應用程序身份驗證的環境中(例如在模擬器上運行時)訪問Google Cloud服務。
創建一個新的API密鑰以用於開發:
- 打開Google Cloud Console的“憑據”頁面。
- 單擊創建憑證> API密鑰,並記下新的API密鑰。此密鑰允許未經身份驗證的應用訪問API,因此請對此密鑰進行保密。
為了確保新的調試API密鑰不會與您發布的應用程序一起洩漏,請在僅用於調試版本的Android清單文件中指定調試API密鑰:
如果您還沒有調試清單,請通過單擊文件>新建>其他> Android清單文件並從目標源集中選擇
debug
來創建一個清單。在調試清單中,添加以下聲明:
<application> <meta-data android:name="com.firebase.ml.cloud.ApiKeyForDebug" android:value="your-debug-api-key" /> </application>
在您的應用中,將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);
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功能時準備啟動應用程序的信息,請參閱啟動清單。