使用應用程式檢查服務保護 API 金鑰安全
Firebase App Check 可封鎖來自正當應用程式以外來源的流量,保護應用程式對 Google 地圖平台發出的呼叫。方法是檢查認證供應商 (例如 App Attest) 的權杖。將應用程式與 App Check 整合,有助於防範惡意要求,避免因未經授權的 API 呼叫而產生費用。
我適合使用 App Check 嗎?
在大多數情況下,建議使用應用程式檢查,但在下列情況下,則不需要或不支援應用程式檢查:
- 您使用的是原始的 Places SDK。應用程式檢查僅支援 Places SDK (新版)。
- 私人或實驗性應用程式。如果應用程式不開放公眾存取,則不需要使用應用程式檢查。
- 如果應用程式只用於伺服器對伺服器通訊,則不需要應用程式檢查。不過,如果與 GMP 通訊的伺服器是由公開用戶端 (例如行動應用程式) 使用,建議使用 App Check 保護該伺服器,而非 GMP。
- 如果驗證提供者認為裝置已遭入侵或不可信任,應用程式檢查建議的驗證提供者就無法在該裝置上運作。如需支援這類裝置,您可以部署自訂認證服務。詳情請參閱操作說明。
導入步驟總覽
如要整合應用程式與應用程式檢查,大致上需要按照下列步驟操作:
- 將 Firebase 新增至應用程式。
- 新增並初始化 App Check 程式庫。
- 在應用程式中新增權杖供應商。
- 初始化 Places 和 App Check API。
- 啟用偵錯功能。
- 監控應用程式要求,並決定是否要強制執行。
整合 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 專案,並將應用程式檢查程式庫新增至應用程式。請按照提供的程式碼範例初始化應用程式檢查。
- 按照 Firebase 操作說明新增 App Check 程式庫:
- 初始化 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];
- 如果您使用 App Attest,請參閱 Firebase 開發人員的 App Attest 說明文件。
步驟 3:新增權杖供應商
在應用程式的根層級建立名為 AppCheckTokenProvider
的檔案 (如果您使用 Objective-C,則建立名為 AppCheckTokenProvider.h
和 AppCheckTokenProvider.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
- 在
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"];
- 接著,初始化 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 說明文件。