1. Einleitung
Sie können Firebase App Check mit App Attest verwenden, um Ihre Back-End-Dienste zu schützen und zu überprüfen, ob Anfragen an Firebase-Dienste von Ihrer authentischen App kommen.
Im Allgemeinen wird empfohlen, Benutzer schrittweise in den App Attest-Dienst einzubinden, um ein Erreichen der Kontingentgrenzen zu vermeiden. Weitere Informationen finden Sie in der Apple-Dokumentation „ Preparing to Use the App Attest Service “.
Die Möglichkeit, App-Updates schrittweise mithilfe der App Store Connect-Funktion von Apple zu veröffentlichen, wie unter „ Phasenweises Veröffentlichen eines Versionsupdates “ beschrieben, kann die Einführung von App Check reibungsloser gestalten. Dies ist eine unkomplizierte und einfache Lösung. Durch die stufenweise Veröffentlichung eines App-Versionsupdates können Sie jedoch nicht den Rollout steuern oder das Verhalten bestehender, aktualisierter Apps ändern, ohne eine neue App-Version zu veröffentlichen.
Eine Möglichkeit, mehr Kontrolle über die Einführung Ihrer App-Prüfung mit App-Attest zu haben, besteht darin, Firebase Remote Config zu verwenden, um App-Prüfung mit App-Attest jeweils für einen Prozentsatz der Benutzer Ihrer App zu aktivieren. Dies kann dazu beitragen, eine Drosselung durch die Nachweisserver zu vermeiden. Mithilfe von Google Analytics können die Auswirkungen des Rollouts auf die Nutzer beobachtet werden.
Was Sie lernen werden
In diesem mehrstufigen Codelab erfahren Sie, wie Sie mit Firebase Remote Config App Check für Ihre App einführen.
Dieses Codelab verwendet ein Firebase-Projekt, das auf der DatabaseExample-Schnellstart-App basiert und in Firebase App Check integriert ist, wie im Codelab Firebase App Check für Apple-Plattformen beschrieben. Mit der DatabaseExample-Schnellstart-App können sich Benutzer anmelden und mithilfe der Funktionen der Firebase Realtime Database Beiträge hinzufügen.
Sie können die Schritte in diesem Codelab auch anpassen, um Ihre eigene App zu testen.
Voraussetzungen
- Firebase App Check für Apple Platforms Codelab abgeschlossen
Was du brauchen wirst
- Xcode 12.5+
- Für App Attest-Tests:
- Ein Apple-Entwicklerkonto, mit dem Sie neue App-IDs erstellen können
- Eine Anwendung mit einer expliziten App-ID mit aktivierter App Attest-Funktion. Wenn Sie Hilfe bei diesem Vorgang benötigen, lesen Sie die Artikel „Eine App-ID registrieren“ und „App-Funktionen aktivieren“ .
- Ein iOS/iPadOS-Gerät, das App Attest unterstützt
- Firebase-Projekt mit:
- Eine iOS-App konfiguriert ( mehr erfahren )
- 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 Remote-Konfigurationen und zum Anzeigen von Google Analytics
2. Erstellen Sie einen benutzerdefinierten Attestierungsanbieter
In diesem Schritt erstellen wir eine benutzerdefinierte Anbieterklasse, um nur dann ein Token bereitzustellen, wenn App Attest aktiviert ist. Remote Config basiert auf einer konfigurierten Firebase-App-Instanz und der benutzerdefinierte Anbieter, den Sie in diesem Schritt implementieren, fungiert als Platzhalter zum Abschluss der Konfiguration.
Um die folgenden Schritte auszuführen, müssen Sie Firebase
, FirebaseRemoteConfig
und FirebaseAnalytics
im Abschnitt „Frameworks, Bibliotheken und eingebettete Inhalte“ Ihrer App in Xcode hinzufügen. Ein Beispiel dafür finden Sie im Codelab zur Firebase-App-Prüfung für Apple-Plattformen .
- Erstellen Sie eine Datei „ MyAppCheckProvider “, die eine Unterklasse von
NSObject
ist, die demAppCheckProvider
-Protokoll entspricht. - Fügen Sie eine leere
getToken()
Methode ein, die Sie später ausfüllen.
Sehen Sie sich den folgenden Beispielcode für die benutzerdefinierte Anbieterklasse mit leerer getToken()
-Methode an.
// MyAppCheckProvider.swift
import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig
class MyAppCheckProvider: NSObject, AppCheckProvider {
func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}
Um AppAttestProvider
zu instanziieren, müssen Sie eine Instanz der 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 Token-Anfrage an den App Attest-Anbieter weiter
Jetzt haben Sie alles, um die Token-Anfrage in Ihrer getToken()
Methode an den App Attest-Anbieter weiterzuleiten.
Hinweis: Weitere Informationen zur getToken()
Methode finden Sie in der FirebaseAppCheck Framework-Referenz .
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)
}
Der vorherige Code überprüft einen booleschen Remote Config- AppAttestEnabled
Parameter (dieser Remote Config-Parameter wird später im Codelab erstellt). Wenn der Wert falsch ist, schlägt der Code fehl, was darauf hinweist, dass App Check nicht auf dem aktuellen Gerät eingeführt wird. Wenn der Wert wahr ist, versucht der Code, einen App Attest-Anbieter zu erhalten, und schlägt fehl, wenn dies nicht möglich ist. Wenn diese Fehlerprüfungen bestanden werden, leitet der Code die Token-Anfrage an den App Attest-Anbieter weiter.
Fügen Sie Analytics-Ereignisse hinzu
Durch das Hinzufügen von Analytics-Ereignissen erhalten Sie bessere Einblicke in den Erfolg des App Check-Rollouts. Mithilfe von Analysen 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. Mithilfe dieser beiden Analytics-Ereignisse können Sie den Erfolg Ihres App Check-Rollouts verfolgen und entscheiden, ob ein größerer Rollout durchgeführt werden sollte.
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. Aktualisieren Sie die Provider Factory-Klasse
Nachdem Sie die Logik zum Weiterleiten der Token-Anfrage an den App Attest-Anbieter implementiert und einige Analytics-Ereignisse hinzugefügt haben, müssen Sie MyAppCheckProviderFactory.class
aktualisieren, das Sie im Codelab „App Check für Apple-Plattformen“ erstellt haben. Diese Klasse zielt auf den App Check-Debug-Anbieter für Simulatoren und ansonsten auf Ihren benutzerdefinierten Anbieter ab.
Bearbeiten Sie den folgenden Code in der MyAppCheckProviderFactory
-Klasse, die Sie im Codelab Firebase App Check für Apple-Plattformen 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
}
}
Bestätigen Sie, dass 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. Fügen Sie einen Remote-Config-Parameter in der Firebase-Konsole hinzu
Sie fügen nun den Remote-Konfigurationsparameter AppAttestEnabled zur Firebase-Konsole hinzu. Ihre getToken
Methode erfordert diesen Parameter.
So erstellen Sie einen Remote-Config-Parameter in der Firebase-Konsole:
- Ö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 Dropdown- Menü Datentyp die Option Boolean aus.
- Wählen Sie im Dropdown- Menü „Standardwert“ die Option „false“ aus.
Bevor Sie auf „Speichern“ klicken, erstellen Sie einen bedingten Wert für 10 % der Benutzer:
- Klicken Sie auf Neu hinzufügen > Bedingter Wert > Neue Bedingung erstellen .
- Geben Sie im Feld „Name“ einen Bedingungsnamen ein.
- Wählen Sie unter Gilt, wenn... die Option Benutzer in zufälligem Perzentil <= aus und geben Sie dann 10 in das Feld % ein.
- Klicken Sie auf Bedingung erstellen .
Legen Sie den bedingten Wert auf „true“ fest, damit App Attest für 10 % Ihrer Benutzer bereitgestellt wird.
- Setzen Sie den Wert für die soeben erstellte Bedingung auf „true“ .
- Klicken Sie auf Speichern .
Wenn Sie fertig sind, veröffentlichen Sie die Remote-Konfigurationsänderungen.
Testen Sie den Rollout auf Ihrem Gerät
Um die verschiedenen Remote Config-Flag-Werte auf Ihrem Gerät zu testen, ohne den App-Code zu ändern, konfigurieren Sie ein Experiment für den AppAttestEnabled -Parameter gemäß dem Tutorial „Firebase Remote Config-Experimente mit A/B-Tests erstellen“ . Im Tutorial-Abschnitt „ Validieren Sie Ihr Experiment auf einem Testgerät “ wird erläutert, wie Sie Ihrem Testgerät unterschiedliche Werte zuweisen.
Der letzte Schritt besteht darin, mithilfe von Google Analytics den Erfolg Ihres App Attest-Rollouts zu überwachen.
5. Überprüfen Sie den Erfolg Ihres AppCheck-Rollouts
Den Erfolg Ihres Rollouts können Sie im Analytics Events Dashboard 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 das Debuggen aktivieren und DebugView verwenden, um Debug-Ereignisse schneller anzuzeigen.
Optional können Sie das Crashlytics-Dashboard auf steigende 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, ist dies ein gutes Zeichen dafür, dass Sie den Prozentsatz der Benutzer mit aktiviertem App Attest erhöhen können, indem Sie die Bedingung im Remote Config-Parameter AppAttestEnabled ändern.
Optional: Nutzen Sie Google Analytics Audience
Wenn Sie das AppAttestEnabled Analytics-Ereignis weiter nutzen möchten, können Sie eine Analytics-Zielgruppe erstellen, um Benutzer zu verfolgen, wobei AppAttestEnabled auf „true“ gesetzt ist.
App Attest wurde mit iOS 14.0 veröffentlicht. Einige Ihrer Benutzer verfügen möglicherweise nicht über diese Version und sind daher nicht für App Attest berechtigt. Sie können ein weiteres Analytics-Ereignis protokollieren, um diese Benutzer zu verfolgen, und dann diese Zielgruppe für eine andere Nachweismethode wie DeviceCheck ansprechen.
Optional: Verwenden Sie Crashlytics, um Abstürze zu überwachen
Um die Stabilität Ihrer App während des Rollouts besser zu verstehen, verwenden Sie Firebase Crashlytics , um Abstürze und nicht schwerwiegende Folgen zu überwachen.
6. Herzlichen Glückwunsch!
Sie haben App Check mit Remote Config erfolgreich eingeführt 🎉