Firebase App Check mit Firebase Remote Config nach und nach einführen

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

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:
  • 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.

  1. Erstellen Sie eine Datei mit dem Namen MyAppCheckProvider, die eine Unterklasse von NSObject ist und dem AppCheckProvider-Protokoll entspricht.
  2. 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 :

  1. Ö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.
  2. Geben Sie im Feld Parametername (Schlüssel) AppAttestEnabled ein.
  3. Wählen Sie im Drop-down-Menü Datentyp die Option Boolesch aus.
  4. Wählen Sie im Drop-down-Menü Standardwert die Option false aus.

Remote Config-Parameter in der Firebase Console erstellen

Bevor Sie auf „Speichern“ klicken, erstellen Sie einen bedingten Wert für 10% der Nutzer:

  1. Klicken Sie auf Neu hinzufügen > Bedingter Wert > Neue Bedingung erstellen.
  2. Geben Sie im Feld Name einen Namen für die Bedingung ein.
  3. Wählen Sie unter Gilt, wenn… die Optionen Nutzer im zufälligen Perzentil, <= und dann im Feld % die Zahl 10 aus.
  4. Klicken Sie auf Bedingung erstellen.

Remote Config-Bedingung in der Firebase Console definieren

Legen Sie den bedingten Wert auf true fest, damit App Attest für 10% Ihrer Nutzer eingeführt wird.

  1. Legen Sie den Wert für die gerade erstellte Bedingung auf true fest.
  2. Klicken Sie auf Speichern.

Remote Config-Parameter in der Firebase Console ansehen

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.

Analytics-Ereignisse in der Firebase Console ansehen

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. 🎉

Zusätzliche Ressourcen: