Führen Sie Firebase App Check schrittweise mit Firebase Remote Config ein

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

Was du brauchen wirst

  • Xcode 12.5+
  • Für App Attest-Tests:
  • Firebase-Projekt mit:
  • 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 .

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

  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 Dropdown- Menü Datentyp die Option Boolean aus.
  4. Wählen Sie im Dropdown- Menü „Standardwert“ die Option „false“ aus.

Remote-Konfigurationsparameter in der Firebase-Konsole erstellen

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

  1. Klicken Sie auf Neu hinzufügen > Bedingter Wert > Neue Bedingung erstellen .
  2. Geben Sie im Feld „Name“ einen Bedingungsnamen ein.
  3. Wählen Sie unter Gilt, wenn... die Option Benutzer in zufälligem Perzentil <= aus und geben Sie dann 10 in das Feld % ein.
  4. Klicken Sie auf Bedingung erstellen .

Definieren einer Remote-Konfigurationsbedingung in der Firebase-Konsole

Legen Sie den bedingten Wert auf „true“ fest, damit App Attest für 10 % Ihrer Benutzer bereitgestellt wird.

  1. Setzen Sie den Wert für die soeben erstellte Bedingung auf „true“ .
  2. Klicken Sie auf Speichern .

Überprüfen des Parameters „Remote Config“ in der Firebase-Konsole

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.

Überprüfen von Analytics-Ereignissen in der Firebase-Konsole

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 🎉

Zusätzliche Ressourcen: