1. Einführung
Sie können Firebase App Check mit App Attest verwenden, um Ihre Backend-Dienste zu schützen und zu überprüfen, ob Anfragen an Firebase-Dienste von Ihrer authentischen App stammen.
Es wird generell empfohlen, Nutzer nach und nach in den App Attest-Dienst aufzunehmen, um Kontingentlimits zu vermeiden. Weitere Informationen finden Sie in der Dokumentation von Apple unter Preparing to Use the App Attest Service.
Die Möglichkeit, App-Updates inkrementell mit der App Store Connect-Funktion von Apple zu veröffentlichen, wie unter Versionsupdate in Phasen veröffentlichen beschrieben, kann die Einführung von App Check reibungsloser gestalten. Das ist eine einfache und unkomplizierte Lösung. Wenn Sie ein App-Versionsupdate stufenweise veröffentlichen, können Sie jedoch nicht den Roll-out steuern oder das Verhalten vorhandener, aktualisierter Apps ändern, ohne eine neue App-Version zu veröffentlichen.
Eine Möglichkeit, mehr Kontrolle über die Einführung von App Check mit App Attest zu haben, besteht darin, Firebase Remote Config zu verwenden, um App Check mit App Attest für einen bestimmten Prozentsatz der App-Nutzer gleichzeitig zu aktivieren. So lässt sich möglicherweise eine Drosselung durch die Attestierungsserver vermeiden. Mit Google Analytics lässt sich die Auswirkung des Roll-outs auf die Nutzer beobachten.
Lerninhalte
In diesem mehrstufigen Codelab erfahren Sie, wie Sie Firebase Remote Config verwenden, um App Check für Ihre App einzuführen.
In diesem Codelab wird ein Firebase-Projekt verwendet, das auf der Schnellstart-App „DatabaseExample“ basiert und in das Firebase App Check integriert ist, wie im Codelab zu Firebase App Check für Apple-Plattformen beschrieben. Mit der Schnellstart-App „DatabaseExample“ können sich Nutzer anmelden und Beiträge mithilfe der Funktionen von Firebase Realtime Database hinzufügen.
Sie können die Schritte in diesem Codelab auch anpassen, um Ihre eigene App zu testen.
Voraussetzungen
- Sie haben das Firebase App Check for Apple Platforms-Codelab abgeschlossen.
Voraussetzungen
- Xcode 12.5 und höher
- Für App Attest-Tests:
- Ein Apple Developer-Konto, mit dem Sie neue App-IDs erstellen können
- Eine Anwendung mit einer expliziten App-ID, für die die App Attest-Funktion aktiviert ist. Wenn Sie Hilfe bei der Registrierung benötigen, lesen Sie die Artikel App-ID registrieren und App-Funktionen aktivieren.
- Ein iOS-/iPadOS-Gerät, das App Attest unterstützt
- Firebase-Projekt mit:
- Eine konfigurierte iOS-App (weitere Informationen)
- Google Analytics, Remote Config und App Check aktiviert
- Zugriff auf das mit Ihrer App verknüpfte Firebase-Projekt, mit Berechtigungen zum Erstellen und Verwalten von Projekten in Remote Config sowie zum Aufrufen von Google Analytics
2. Benutzerdefinierten Attestierungsanbieter erstellen
In diesem Schritt erstellen wir eine benutzerdefinierte Anbieterklasse, die ein Token nur dann bereitstellt, wenn App Attest aktiviert ist. Remote Config basiert auf einer konfigurierten Firebase-App-Instanz. Der benutzerdefinierte Anbieter, den Sie in diesem Schritt implementieren, dient als Platzhalter, um die Konfiguration abzuschließen.
Für die folgenden Schritte müssen Sie Firebase
, FirebaseRemoteConfig
und FirebaseAnalytics
im Bereich Frameworks, Libraries, and Embedded Content Ihrer App in Xcode hinzufügen. Ein Beispiel dafür finden Sie im Codelab für Firebase App Check für Apple-Plattformen.
- Erstellen Sie eine Datei mit dem Namen MyAppCheckProvider, die eine Unterklasse von
NSObject
ist und demAppCheckProvider
-Protokoll entspricht. - Fügen Sie eine leere
getToken()
-Methode ein, die Sie später ausfüllen.
Im folgenden Beispielcode sehen Sie die benutzerdefinierte Anbieterklasse mit leerer getToken()
-Methode.
// MyAppCheckProvider.swift
import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig
class MyAppCheckProvider: NSObject, AppCheckProvider {
func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}
Zum Instanziieren von AppAttestProvider
müssen Sie eine Instanz des entsprechenden FirebaseApp
übergeben. Erstellen Sie eine gespeicherte Eigenschaft dafür und akzeptieren Sie sie als Initialisierungsparameter:
// 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) {}
}
Leiten Sie die Tokenanfrage an den App Attest-Anbieter weiter.
Jetzt haben Sie alles, was Sie benötigen, um die Tokenanfrage in Ihrer getToken()
-Methode an den App Attest-Anbieter weiterzuleiten.
Hinweis: Weitere Informationen zur Methode getToken()
finden Sie in der Firebase App Check Framework Reference.
Fügen Sie Ihrer getToken()
-Methode den folgenden Code hinzu:
// 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)
}
Im vorherigen Code wird ein boolescher Remote Config-Parameter AppAttestEnabled
geprüft. Dieser Remote Config-Parameter wird später im Codelab erstellt. Wenn der Wert „false“ ist, schlägt der Code fehl. Das bedeutet, dass App Check auf dem aktuellen Gerät nicht eingeführt wird. Wenn der Wert „true“ ist, versucht der Code, einen App Attest-Anbieter abzurufen. Wenn das nicht möglich ist, schlägt der Vorgang fehl. Wenn diese Fehlerprüfungen bestanden werden, leitet der Code die Tokenanfrage an den App Attest-Anbieter weiter.
Analytics-Ereignisse hinzufügen
Wenn Sie Analytics-Ereignisse hinzufügen, erhalten Sie bessere Informationen dazu, wie erfolgreich das App Check-Rollout ist. Mit Analytics lässt sich ermitteln, ob App Attest für eine größere Zielgruppe aktiviert werden sollte.
Protokollieren Sie zwei Analytics-Ereignisse: AppAttestSuccess bei Erfolg und AppAttestFailure bei Fehler. Mit diesen beiden Analytics-Ereignissen können Sie den Erfolg der Einführung von App Check nachvollziehen und entscheiden, ob eine größere Einführung erfolgen soll.
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-Klasse aktualisieren
Nachdem Sie die Logik zum Weiterleiten der Tokenanfrage an den App Attest-Anbieter implementiert und einige Analytics-Ereignisse hinzugefügt haben, müssen Sie MyAppCheckProviderFactory.class
aktualisieren, das Sie im App Check for Apple Platforms-Codelab erstellt haben. Diese Klasse ist für Simulatoren auf den App Check-Debug-Anbieter und ansonsten auf Ihren benutzerdefinierten Anbieter ausgerichtet.
Bearbeiten Sie den folgenden Code in der Klasse MyAppCheckProviderFactory
, die Sie im Firebase App Check für Apple-Plattformen-Codelab erstellt haben:
// 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
}
}
Prüfen Sie, ob Sie AppCheckProviderFactory
festgelegt haben, bevor Sie FirebaseApp
konfigurieren:
// DatabaseExampleApp.swift
import SwiftUI
import Firebase
import FirebaseAppCheck
@main
struct DatabaseExampleApp: App {
init() {
AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
FirebaseApp.configure()
}
// ...
}
4. Remote Config-Parameter in der Firebase Console hinzufügen
Fügen Sie nun den Remote Config-Parameter AppAttestEnabled in der Firebase Console hinzu . Dieser Parameter ist für Ihre getToken
-Methode erforderlich.
So erstellen Sie einen Remote Config-Parameter in der Firebase Console :
- Öffnen Sie Remote Config für Ihr Projekt und klicken Sie auf Parameter hinzufügen. Wenn Sie Remote Config zum ersten Mal verwenden, klicken Sie auf Konfiguration erstellen.
- Geben Sie im Feld Parametername (Schlüssel)
AppAttestEnabled
ein. - Wählen Sie im Drop-down-Menü Datentyp die Option Boolesch aus.
- Wählen Sie im Drop-down-Menü Standardwert die Option false aus.
Bevor Sie auf „Speichern“ klicken, erstellen Sie einen bedingten Wert für 10% der Nutzer:
- Klicken Sie auf Neu hinzufügen > Bedingter Wert > Neue Bedingung erstellen.
- Geben Sie im Feld Name einen Namen für die Bedingung ein.
- Wählen Sie unter Gilt, wenn… die Optionen Nutzer im zufälligen Perzentil, <= und dann im Feld % die Zahl 10 aus.
- Klicken Sie auf Bedingung erstellen.
Legen Sie den bedingten Wert auf true fest, damit App Attest für 10% Ihrer Nutzer eingeführt wird.
- Legen Sie den Wert für die gerade erstellte Bedingung auf true fest.
- Klicken Sie auf Speichern.
Wenn Sie fertig sind, veröffentlichen Sie die Remote Config-Änderungen.
Roll-out auf Ihrem Gerät testen
Wenn Sie die verschiedenen Remote Config-Flag-Werte auf Ihrem Gerät testen möchten, ohne den App-Code zu ändern, konfigurieren Sie einen Test für den Parameter AppAttestEnabled. Folgen Sie dazu dem Tutorial zum Erstellen von Firebase Remote Config-Tests mit A/B Testing. Im Tutorial-Abschnitt Test auf einem Testgerät validieren wird beschrieben, wie Sie Ihrem Testgerät verschiedene Werte zuweisen.
Im letzten Schritt müssen Sie mit Google Analytics den Erfolg der Einführung von App Attest überwachen.
5. Erfolg des AppCheck-Roll-outs prüfen
Sie können den Erfolg der Einführung im Dashboard „Analytics-Ereignisse“ messen. Achten Sie auf die Ereignisse AppAttestSuccess und AppAttestFailure. Es kann bis zu 24 Stunden dauern, bis Ereignisse im Dashboard angezeigt werden. Alternativ können Sie die Fehlerbehebung aktivieren und DebugView verwenden, um Debug-Ereignisse schneller zu sehen.
Optional können Sie das Crashlytics-Dashboard auf erhöhte Absturzraten überwachen. Weitere Informationen zum Hinzufügen von Crashlytics zu Ihrer App finden Sie unter Erste Schritte mit Firebase Crashlytics.
Wenn Sie hauptsächlich AppAttestSuccess-Ereignisse und nur wenige AppAttestFailure-Ereignisse sehen, können Sie den Prozentsatz der Nutzer mit aktivierter App-Attestierung erhöhen, indem Sie die Bedingung im Remote Config-Parameter AppAttestEnabled ändern.
Optional: Google Analytics-Zielgruppen nutzen
Wenn Sie das Analytics-Ereignis AppAttestEnabled noch besser nutzen möchten, können Sie eine Analytics-Zielgruppe erstellen, um Nutzer mit AppAttestEnabled auf „true“ zu erfassen.
App Attest wurde mit iOS 14.0 eingeführt. Einige Ihrer Nutzer verwenden möglicherweise nicht dieses Release und sind daher nicht für App Attest berechtigt. Sie können ein weiteres Analytics-Ereignis protokollieren, um diese Nutzer zu erfassen, und dann diese Zielgruppe für eine andere Attestierungsmethode wie DeviceCheck ausrichten.
Optional: Crashlytics zum Überwachen von Abstürzen verwenden
Mit Firebase Crashlytics können Sie Abstürze und nicht schwerwiegende Fehler im Blick behalten und so die Stabilität Ihrer App während der Einführung besser nachvollziehen.
6. Glückwunsch!
Sie haben App Check mit Remote Config erfolgreich eingeführt. 🎉