1. 簡介
您可以搭配使用 Firebase App Check 和 App Attest,保護後端服務,並確認傳送至 Firebase 服務的要求是否來自正版應用程式。
一般來說,建議您逐步讓使用者加入 App Attest 服務,以免達到配額限制。詳情請參閱 Apple 的「準備使用 App Attest 服務」說明文件。
如「分階段發布版本更新」一文所述,使用 Apple 的 App Store Connect 功能逐步發布應用程式更新,可讓 App Check 推出過程更加順暢。這是簡單明瞭的解決方案。不過,如果分階段發布應用程式版本更新,您就無法控制推出時間,也無法在不發布新版應用程式的情況下,變更現有更新版應用程式的行為。
如要更進一步控管 App Check 與 App Attest 的推出作業,不妨使用 Firebase 遠端設定,一次為一定比例的應用程式使用者啟用 App Check 與 App Attest。這有助於避免認證伺服器節流。您可以使用 Google Analytics 觀察推出作業對使用者的影響。
課程內容
在本程式碼研究室中,您將逐步瞭解如何使用 Firebase 遠端設定,為應用程式推出 App Check。
本程式碼研究室會使用以 DatabaseExample 快速入門導覽課程應用程式為基礎的 Firebase 專案,並整合 Firebase App Check,如 Firebase App Check for Apple Platforms 程式碼研究室所述。使用者可以透過 DatabaseExample 快速入門應用程式登入,並使用 Firebase 即時資料庫的功能新增貼文。
您也可以調整這個程式碼研究室中的步驟,測試自己的應用程式。
必要條件
軟硬體需求
- Xcode 12.5 以上版本
- 如要測試 App Attest,請按照下列步驟操作:
- Apple 開發人員帳戶,可供您建立新的應用程式 ID
- 啟用 App Attest 功能的應用程式,並具有明確的應用程式 ID。如需相關協助,請參閱「註冊應用程式 ID」和「啟用應用程式功能」文章。
- 支援 App Attest 的 iOS/iPadOS 裝置
- Firebase 專案,其中包含:
- 已設定 iOS 應用程式 (瞭解詳情)
- 已啟用 Google Analytics、遠端設定和 App Check
- 可存取與應用程式相關聯的 Firebase 專案,且有權限建立和管理遠端設定,以及查看 Google Analytics
2. 建立自訂認證供應商
在這個步驟中,我們會建立自訂供應器類別,只在啟用 App Attest 時提供權杖。遠端設定會使用已設定的 Firebase 應用程式例項,而您在這個步驟中導入的自訂供應器,則會做為完成設定的預留位置。
如要完成下列步驟,請在 Xcode 中應用程式的「Frameworks, Libraries, and Embedded Content」部分新增 Firebase
、FirebaseRemoteConfig
和 FirebaseAnalytics
。如需相關範例,請參閱 Apple 平台適用的 Firebase App Check 程式碼研究室。
- 建立「MyAppCheckProvider」檔案,這個檔案是
NSObject
的子類別,符合AppCheckProvider
通訊協定。 - 加入空白的
getToken()
方法,稍後再填寫。
請參閱下列範例程式碼,瞭解具有空白 getToken()
方法的自訂供應商類別。
// MyAppCheckProvider.swift
import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig
class MyAppCheckProvider: NSObject, AppCheckProvider {
func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}
如要將 AppAttestProvider
執行個體化,您需要傳遞相應的 FirebaseApp
執行個體。為其建立儲存屬性,並接受做為初始值設定工具參數:
// MyAppCheckProvider.swift
import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig
class MyAppCheckProvider: NSObject, AppCheckProvider {
// Firebase app instance served by the provider.
let firebaseApp: FirebaseApp
// The App Check provider factory should pass the FirebaseApp instance.
init(app: FirebaseApp) {
self.firebaseApp = app
super.init()
}
func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}
將權杖要求轉送給 App Attest 提供者
現在您已掌握所有資訊,可將權杖要求轉送至 getToken()
方法中的 App Attest 供應商。
注意:如要進一步瞭解 getToken()
方法,請參閱 FirebaseAppCheck 架構參考資料。
將下列程式碼新增至 getToken()
方法:
// MyAppCheckProvider.swift
import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig
class MyAppCheckProvider: NSObject, AppCheckProvider {
// Firebase app instance served by the provider.
let firebaseApp: FirebaseApp
// The App Check provider factory should pass the FirebaseApp instance.
init(app: FirebaseApp) {
self.firebaseApp = app
super.init()
}
private lazy var appAttestProvider = AppAttestProvider(app: firebaseApp)
func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
// Fetch App Attest flag from Remote Config
let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
remoteConfig.fetchAndActivate { remoteConfigStatus, error in
// Get App Attest flag value
let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue
guard appAttestEnabled else {
// Skip attestation if App Attest is disabled. Another attestation
// method like DeviceCheck may be used instead of just skipping.
handler(nil, MyProviderError.appAttestIsDisabled)
return
}
// Try to obtain an App Attest provider instance and fail if cannot
guard let appAttestProvider = self.appAttestProvider else {
handler(nil, MyProviderError.appAttestIsUnavailable)
return
}
// If App Attest is enabled for the app instance, then forward the
// Firebase App Check token request to the App Attest provider
appAttestProvider.getToken(completion: handler)
}
}
}
enum MyProviderError: Error {
case appAttestIsDisabled
case appAttestIsUnavailable
case unexpected(code: Int)
}
先前的程式碼會檢查遠端設定 AppAttestEnabled
布林值參數 (這個遠端設定參數會在稍後的程式碼研究室中建立)。如果值為 false,表示程式碼失敗,指出目前裝置未推出應用程式檢查功能。如果值為 true,程式碼會嘗試取得 App Attest 供應商,如果無法取得,就會失敗。如果通過這些錯誤檢查,程式碼會將權杖要求轉送至 App Attest 供應商。
新增 Analytics 事件
加入 Analytics 事件後,您就能更深入瞭解 App Check 的推出成效。Analytics 有助於判斷是否應為更多使用者啟用 App Attest。
記錄兩項 Analytics 事件:成功時為 AppAttestSuccess,失敗時為 AppAttestFailure。這兩項 Analytics 事件有助於追蹤 App Check 的推出成效,並決定是否要擴大推出範圍。
func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
// Fetch Remote Config.
let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
remoteConfig.fetchAndActivate { remoteConfigStatus, error in
// Get App Attest flag value from Remote Config.
let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue
guard appAttestEnabled else {
// Skip attestation if App Attest is disabled. Another attestation
// method like DeviceCheck may be used instead of just skipping.
handler(nil, MyProviderError.appAttestIsDisabled)
return
}
// Try to obtain an App Attest provider instance and fail otherwise.
guard let appAttestProvider = self.appAttestProvider else {
handler(nil, MyProviderError.appAttestIsUnavailable)
return
}
// If App Attest is enabled for the app instance, then forward the
// Firebase App Check token request to the App Attest provider.
appAttestProvider.getToken { token, error in
// Log an Analytics event to track attestation success rate.
let appAttestEvent: String
if (token != nil && error == nil) {
appAttestEvent = "AppAttestSuccess"
} else {
appAttestEvent = "AppAttestFailure"
}
Analytics.logEvent(appAttestEvent, parameters: nil)
// Pass the result to the handler
handler(token, error)
}
}
}
3. 更新 Provider Factory 類別
實作將權杖要求轉送至 App Attest 提供者的邏輯,並新增一些 Analytics 事件後,您需要更新在 App Check for Apple Platforms 程式碼研究室中建立的 MyAppCheckProviderFactory.class
。這個類別會以模擬器的 App Check 偵錯提供者為目標,否則會以自訂提供者為目標。
在您於 Firebase App Check for Apple platforms 程式碼研究室中建立的 MyAppCheckProviderFactory
類別中,編輯下列程式碼:
// MyAppCheckProviderFactory.swift
import Firebase
class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
#if targetEnvironment(simulator)
// App Attest is not available on simulators.
// Use a debug provider.
let provider = AppCheckDebugProvider(app: app)
// Print only locally generated token to avoid a valid token leak on CI.
print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")
return provider
#else
if #available(iOS 14.0, *) {
// Use your custom App Attest provider on real devices.
return MyAppCheckProvider(app: app)
} else {
return DeviceCheckProvider(app: app)
}
#endif
}
}
請確認您已設定 AppCheckProviderFactory
,再設定 FirebaseApp
:
// DatabaseExampleApp.swift
import SwiftUI
import Firebase
import FirebaseAppCheck
@main
struct DatabaseExampleApp: App {
init() {
AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
FirebaseApp.configure()
}
// ...
}
4. 在 Firebase 控制台中新增遠端設定參數
現在請將遠端設定參數 AppAttestEnabled 新增至 Firebase 控制台。您的 getToken
方法需要這個參數。
如要在 Firebase 控制台中建立遠端設定參數,請按照下列步驟操作:
- 開啟專案的「遠端設定」,然後按一下「新增參數」。如果這是您第一次使用 Remote Config,請按一下「建立設定」。
- 在「Parameter name (key)」(參數名稱 (鍵)) 欄位中,輸入
AppAttestEnabled
。 - 從「資料類型」下拉式選單中,選取「布林值」。
- 在「預設值」下拉式選單中,選取「false」。
按一下「儲存」前,請為 10% 的使用者建立條件值:
- 依序點選「新增」 >「條件值」 >「建立新條件」。
- 在「名稱」欄位中輸入條件名稱。
- 在「適用條件」下方,依序選取「使用者位於隨機百分位數」、「<=」,然後在「%」欄位中輸入「10」。
- 按一下「建立條件」。
將條件值設為 true,這樣 App Attest 就會向 10% 的使用者推出。
- 將剛才建立的條件值設為 true。
- 按一下 [儲存]。
完成後,請發布遠端設定變更。
在裝置上測試推出作業
如要在裝置上測試不同的遠端設定旗標值,但不想修改應用程式程式碼,請按照「建立 Firebase 遠端設定實驗並進行 A/B 測試」教學課程,設定 AppAttestEnabled 參數的實驗。如要瞭解如何為測試裝置指派不同值,請參閱「在測試裝置上驗證實驗」教學課程。
最後一步是使用 Google Analytics 監控應用程式認證推出作業的成效。
5. 查看 AppCheck 推出作業的成效
您可以在「數據分析事件」資訊主頁中,評估推出成效。請注意 AppAttestSuccess 和 AppAttestFailure 事件。事件最多可能要過 24 小時才會顯示在資訊主頁中。或者,您也可以啟用偵錯功能,並使用 DebugView 更快速地查看偵錯事件。
您也可以視需要監控 Crashlytics 資訊主頁,查看當機率是否提高。如要進一步瞭解如何在應用程式中加入 Crashlytics,請參閱「開始使用 Firebase Crashlytics」。
如果大部分都是 AppAttestSuccess 事件,只有少數 AppAttestFailure 事件,表示您可以修改遠端設定參數 AppAttestEnabled 中的條件,提高啟用 App Attest 的使用者百分比。
選用:善用 Google Analytics 目標對象
如要進一步運用 AppAttestEnabled Analytics 事件,可以建立 Analytics 目標對象,追蹤 AppAttestEnabled 設為 true 的使用者。
App Attest 隨 iOS 14.0 一併推出,部分使用者可能未採用這個版本,因此不符合 App Attest 資格。您可以記錄另一個 Analytics 事件來追蹤這些使用者,然後針對該目標對象採用其他認證方法,例如 DeviceCheck。
選用:使用 Crashlytics 監控當機情況
如要進一步瞭解應用程式在推出期間的穩定性,請使用 Firebase Crashlytics 監控當機和一般錯誤。
6. 恭喜!
您已透過遠端設定成功推出 App Check 🎉