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

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

1. 縮小現有 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 限制清單。

2. 建立新的 API 金鑰,用於 Firebase ML

接著,為 Firebase ML 建立新的 API 金鑰並僅允許呼叫 Cloud Vision API:

  1. 返回「Credentials」(憑證) 頁面。確認您仍選取 Firebase 專案。

  2. 依序按一下「建立憑證」>「API 金鑰」。記下新的 API 金鑰,然後點選「限制金鑰」

  3. 在「API 限制」專區中,選取「限制金鑰」,然後在清單中「僅」新增 Cloud Vision API。

這個 API 金鑰只會授予 Cloud Vision API 存取權,Firebase ML 可用來存取雲端模型。

為減輕金鑰遭到入侵的後果,請將 Cloud Vision API 的每位使用者配額從預設值調降。方法如下:

  1. 開啟 Google Cloud 控制台的 Cloud Vision API 配額頁面。系統出現提示時,請選取您的專案。

  2. 在「要求數」部分中,將「每位使用者的每分鐘要求數」配額設為應用程式合理的。例如,如果應用程式需要上傳文件來取回文字,使用者不太可能每隔幾秒再執行這個動作一次,因此 30-40 的配額應該是安全的。

    請注意,在本例中,「每位使用者的請求」是指來自單一 IP 位址的請求。如果您希望多位使用者同時透過 NAT 使用您的應用程式,可能需要考慮這點。

4. 使用 Firebase ML API 金鑰呼叫 Cloud API

最後,請在應用程式中設定 Firebase ML,以便使用新的 API 金鑰。

由於 Firebase ML API 金鑰可讓未經驗證的使用者存取 Cloud Vision API,因此請務必妥善保管金鑰,以免遭到未經授權的使用,並向您的帳單帳戶收取費用。為此,請勿在應用程式二進位檔中加入 API 金鑰。而是在應用程式執行階段驗證已登入已知的良好使用者,然後再從伺服器擷取 API 金鑰。

即使我們觀察到這些做法,API 金鑰仍可能遭到外洩。您應採取措施,盡量減輕遭盜用金鑰所造成的後果,例如如上所述減少 API 的每位使用者配額、實施金鑰輪替政策,以及向不同使用者群組發出不同的金鑰。

應用程式安全取得 API 金鑰後,如要呼叫 Firebase ML Cloud API,請指定金鑰:

Swift

if let cloudVisionKey = getYourApiKey() {  // See note above about securing your API key
    let options = VisionCloudDetectorOptions()
    options.apiKeyOverride = cloudVisionKey
    let cloudDetector = Vision.vision().cloudLandmarkDetector(options: options)
}

Objective-C

NSString *cloudVisionKey = [self getYourApiKey];  // See note above about securing your API key
if (cloudVisionKey != nil) {
    FIRVisionCloudDetectorOptions *options =
            [[FIRVisionCloudDetectorOptions alloc] init];
    options.APIKeyOverride = cloudVisionKey;
    FIRVisionCloudLandmarkDetector *landmarkDetector =
            [vision cloudLandmarkDetectorWithOptions:options];
}

此外,請遵循「保護 API 金鑰」一文中的一般建議。

後續步驟

如要瞭解如何在使用其他 Firebase 功能時,準備應用程式以便啟動,請參閱啟動檢查清單