選取平台: Android iOS JavaScript

使用應用程式檢查服務保護 API 金鑰安全

Firebase App Check 可封鎖來自正當應用程式以外來源的流量,保護應用程式對 Google 地圖平台發出的呼叫。方法是檢查認證供應商 (例如 App Attest) 的權杖。將應用程式與 App Check 整合,有助於防範惡意要求,避免因未經授權的 API 呼叫而產生費用。

我適合使用 App Check 嗎?

在大多數情況下,建議使用應用程式檢查,但在下列情況下,則不需要或不支援應用程式檢查:

  • 您使用的是原始的 Places SDK。應用程式檢查僅支援 Places SDK (新版)
  • 私人或實驗性應用程式。如果應用程式不開放公眾存取,則不需要使用應用程式檢查。
  • 如果應用程式只用於伺服器對伺服器通訊,則不需要應用程式檢查。不過,如果與 GMP 通訊的伺服器是由公開用戶端 (例如行動應用程式) 使用,建議使用 App Check 保護該伺服器,而非 GMP。
  • 如果驗證提供者認為裝置已遭入侵或不可信任,應用程式檢查建議的驗證提供者就無法在該裝置上運作。如需支援這類裝置,您可以部署自訂認證服務。詳情請參閱操作說明

導入步驟總覽

如要整合應用程式與應用程式檢查,大致上需要按照下列步驟操作:

  1. 將 Firebase 新增至應用程式。
  2. 新增並初始化 App Check 程式庫。
  3. 在應用程式中新增權杖供應商。
  4. 初始化 Places 和 App Check API。
  5. 啟用偵錯功能。
  6. 監控應用程式要求,並決定是否要強制執行。

整合 App Check 後,您就能在 Firebase 控制台查看後端流量指標。這些指標會根據要求是否附上有效的 App Check 權杖,提供要求詳細資料。詳情請參閱 Firebase App Check 說明文件

確認大部分要求來自合法來源,且使用者已更新至包含 App Check 實作的最新版應用程式後,即可啟用強制執行功能。強制執行後,App Check 會拒絕所有不具備有效 App Check 權杖的流量。

規劃整合 App Check 時的注意事項

規劃整合時,請考量下列事項:

  • 我們建議使用的認證供應商「Device Check」或「App Attest」會受到 Apple 設定的配額和限制。

    您可以選擇使用自訂認證供應商,但這是進階用途。詳情請參閱 Firebase App Check 說明文件

  • 應用程式啟動時,使用者會遇到一些延遲。不過,之後的定期重新認證會在背景執行,使用者應不會再遇到任何延遲問題。啟動時的確切延遲時間取決於您選擇的認證供應商。

    App Check 權杖的效期 (即存留時間或 TTL) 決定了重新驗證的頻率。您可以在 Firebase 控制台中設定這段時間。當 TTL 大約過了一半時,就會重新認證。詳情請參閱驗證供應商的 Firebase 文件

將應用程式與 App Check 整合

必要條件和規定

  • 已安裝 Places SDK 9.2 以上版本的應用程式。
  • 應用程式的軟體包 ID
  • Apple Member Center 的團隊 ID (位於「Membership」下方)。
  • 如果您打算使用裝置檢查,請準備私密金鑰檔案金鑰 ID
  • 您必須是 Cloud 控制台中應用程式的擁有者。
  • 您需要 Cloud 控制台中的應用程式專案 ID

步驟 1:將 Firebase 新增至應用程式

按照 Firebase 開發人員說明文件中的操作說明,將 Firebase 新增至應用程式。

註冊應用程式後,您會收到設定檔 GoogleService-Info.plist。將這個檔案 (未經修改) 新增至應用程式的根層級。

iOS 版 Places Swift SDK

import FirebaseCore
import FirebaseAppCheck
import GooglePlacesSwift

Swift

import FirebaseCore
import FirebaseAppCheck
import GooglePlaces

Objective-C

@import FirebaseCore;      
@import FirebaseAppCheck;
@import GooglePlaces;

步驟 2:加入 App Check 程式庫並初始化 App Check

Firebase 會提供各個預設認證供應商的操作說明。這些操作說明會引導您設定 Firebase 專案,並將應用程式檢查程式庫新增至應用程式。請按照提供的程式碼範例初始化應用程式檢查。

  1. 按照 Firebase 操作說明新增 App Check 程式庫:
  2. 初始化 App Check。
    • 如果您使用 App Attest,請參閱 Firebase 開發人員的 App Attest 說明文件

      請按照 Firebase App Check 操作說明建立 AppCheckProviderFactory 的實作項目,並將其新增至 AppDelegate 檔案。

      iOS 版 Places Swift SDK

      let providerFactory = YourAppCheckProviderFactory()
      AppCheck.setAppCheckProviderFactory(providerFactory)

      Swift

      let providerFactory = YourAppCheckProviderFactory()
      AppCheck.setAppCheckProviderFactory(providerFactory)

      Objective-C

      YourAppCheckProviderFactory *providerFactory =
          [[YourAppCheckProviderFactory alloc] init];
      [FIRAppCheck setAppCheckProviderFactory:providerFactory];
         
    • 如果您使用裝置檢查,請將下列項目新增至 AppDelegate

      iOS 版 Places Swift SDK

      AppCheck.setAppCheckProviderFactory(DeviceCheckProviderFactory())

      Swift

      AppCheck.setAppCheckProviderFactory(DeviceCheckProviderFactory())

      Objective-C

      [FIRAppCheck setAppCheckProviderFactory:providerFactory];
            

步驟 3:新增權杖供應商

在應用程式的根層級建立名為 AppCheckTokenProvider 的檔案 (如果您使用 Objective-C,則建立名為 AppCheckTokenProvider.hAppCheckTokenProvider.m 的兩個檔案)。 加入下列匯入陳述式和類別定義:

iOS 版 Places Swift SDK

// AppCheckTokenProvider.swift

import FirebaseAppCheck
import Foundation
import GooglePlacesSwift
      
struct TokenProvider: AppCheckTokenProvider {
  func fetchAppCheckToken() async throws -> String {
    return try await AppCheck.appCheck().token(forcingRefresh: false).token
  }
}
      

Swift

// AppCheckTokenProvider.swift

import FirebaseAppCheck
import Foundation
import GooglePlaces

class AppCheckTokenProvider: NSObject, GMSPlacesAppCheckTokenProvider {
  func fetchAppCheckToken() async throws -> String {
    return try await AppCheck.appCheck().token(forcingRefresh: false).token
  }
}

Objective-C

// AppCheckTokenProvider.h

@import Foundation;
@import GooglePlaces;

@interface AppCheckTokenProvider : NSObject <GMSPlacesAppCheckTokenProvider>
@end

// AppCheckTokenProvider.m

#import "AppCheckTokenProvider.h"

@import FirebaseAppCheck;

@implementation AppCheckTokenProvider

- (void)fetchAppCheckTokenWithCompletion:(nonnull GMSAppCheckTokenCompletion)completion {
  [[FIRAppCheck appCheck]
      tokenForcingRefresh:NO
               completion:^(FIRAppCheckToken *_Nullable token, NSError *_Nullable error) {
                 if (token) {
                   completion(token.token, nil);
                 } else {
                   completion(nil, error);
                 }
               }];
}

@end

步驟 4:初始化 Places 和 App Check API

  1. AppDelegate 檔案中,初始化 Places API:

    iOS 版 Places Swift SDK

    PlacesClient.provideAPIKey("YOUR_API_KEY")

    Swift

    GMSPlacesClient.provideAPIKey("YOUR_API_KEY")

    Objective-C

    [GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];
  2. 接著,初始化 App Check API:

    iOS 版 Places Swift SDK

    PlacesClient.setAppCheckTokenProvider(AppCheckTokenProvider())

    Swift

    GMSPlacesClient.setAppCheckTokenProvider(AppCheckTokenProvider())

    Objective-C

    [GMSPlacesClient setAppCheckTokenProvider:[[AppCheckTokenProvider alloc] init]];

步驟 5:啟用偵錯功能 (選用)

如要在本機開發及測試應用程式,或在持續整合 (CI) 環境中執行應用程式,可以建立應用程式的偵錯版本,並使用偵錯密鑰取得有效的應用程式檢查權杖。這樣您就能避免在偵錯版本中使用真實的認證提供者。

如要在模擬器或測試裝置中測試應用程式,請按照下列步驟操作:

  • 建立及設定 App Check 偵錯提供者 Factory。

    這個程式碼範例會處理偵錯和實際執行環境情境:

    iOS 版 Places Swift SDK

    #if targetEnvironment(simulator)
          let providerFactory = AppCheckDebugProviderFactory()
    #else
          let providerFactory = YourAppCheckProviderFactory()
    #endif

    Swift

    #if targetEnvironment(simulator)
          let providerFactory = AppCheckDebugProviderFactory()
    #else
          let providerFactory = YourAppCheckProviderFactory()
    #endif

    Objective-C

    if (targetEnvironment == simulator){
    
    FIRAppCheckDebugProviderFactory *providerFactory =
          [[FIRAppCheckDebugProviderFactory alloc] init];
    [FIRAppCheck setAppCheckProviderFactory:providerFactory];
    }
    
    else {
    
    YourAppCheckProviderFactory *providerFactory =
          [[YourAppCheckProviderFactory alloc] init];
    [FIRAppCheck setAppCheckProviderFactory:providerFactory];
    }
        
  • 在 Xcode 專案中啟用記錄功能、啟動應用程式,並在記錄中找出本機偵錯權杖。
  • 將這個權杖新增至 Firebase 控制台。
  • 如需更多資訊和操作說明,請參閱 App Check 說明文件

如要在 CI 環境中執行應用程式,請按照下列步驟操作:

  • 在 Firebase 控制台中建立偵錯權杖,並新增至 CI 系統的安全金鑰儲存庫。
  • 在 Xcode 中,將環境變數新增至測試架構,並將名稱設為 FIRAAppCheckDebugToken,值設為 $(APP_CHECK_DEBUG_TOKEN) (或類似的值)。
  • 在 CI 測試指令碼中,將偵錯權杖做為環境變數傳遞
  • 建立及設定 App Check 偵錯提供者 Factory。

    這個程式碼範例會處理偵錯和實際執行環境情境:

    iOS 版 Places Swift SDK

    #if DEBUG
      let providerFactory = AppCheckDebugProviderFactory()
    #else
      let providerFactory = YourAppCheckProviderFactory()
    #endif
    AppCheck.setAppCheckProviderFactory(providerFactory)
      

    Swift

    #if DEBUG
      let providerFactory = AppCheckDebugProviderFactory()
    #else
      let providerFactory = YourAppCheckProviderFactory()
    #endif
    AppCheck.setAppCheckProviderFactory(providerFactory)
      

    Objective-C

    #if DEBUG
    id<FIRAppCheckProviderFactory> providerFactory =
        [[FIRAppCheckDebugProviderFactory alloc] init];
    #else  // DEBUG
    id<FIRAppCheckProviderFactory> providerFactory =
        [[YourAppCheckProviderFactory alloc] init];
    #endif  // DEBUG
    AppCheck.setAppCheckProviderFactory(providerFactory)
  • 如需更多資訊和操作說明,請參閱 App Check 說明文件

步驟 6:監控應用程式要求並決定強制執行方式

開始強制執行前,請先確認不會影響應用程式的合法使用者。為此,請前往「應用程式檢查」指標畫面,查看應用程式流量中,已驗證、過時或違法的流量百分比。確認大部分流量都已通過驗證後,即可啟用強制執行功能。

如需更多資訊和操作說明,請參閱 Firebase App Check 說明文件