Déployez progressivement Firebase App Check à l'aide de Firebase Remote Config

1. Introduction

Vous pouvez utiliser Firebase App Check avec App Attest pour protéger vos services backend et vérifier que les demandes adressées aux services Firebase proviennent de votre application authentique.

Il est généralement recommandé d’intégrer progressivement les utilisateurs au service App Attest pour éviter d’atteindre les limites de quota. Pour plus d'informations, consultez la documentation d'Apple « Préparation à l'utilisation du service d'attestation d'application ».

La possibilité de publier des mises à jour d'applications de manière incrémentielle à l'aide de la fonctionnalité App Store Connect d'Apple, comme décrit dans « Publier une mise à jour de version par phases », peut rendre le déploiement d'App Check plus fluide. Il s’agit d’une solution simple et directe. Cependant, la publication d'une mise à jour de version d'application par étapes ne vous permet pas de contrôler le déploiement ou de modifier le comportement des applications mises à jour existantes sans publier une nouvelle version de l'application.

Une façon d'avoir plus de contrôle sur votre déploiement App Check avec App Attest consiste à utiliser Firebase Remote Config pour activer App Check avec App Attest pour un pourcentage d'utilisateurs de votre application à la fois. Cela peut aider à éviter la limitation des serveurs d'attestation. Google Analytics peut être utilisé pour observer l'impact du déploiement sur les utilisateurs.

Ce que vous apprendrez

Dans cet atelier de programmation en plusieurs étapes, vous apprendrez à utiliser Firebase Remote Config pour déployer App Check pour votre application.

Cet atelier de programmation utilise un projet Firebase basé sur l'application de démarrage rapide DatabaseExample et intégré à Firebase App Check, comme décrit dans l' atelier de programmation Firebase App Check pour les plates-formes Apple . L'application de démarrage rapide DatabaseExample permet aux utilisateurs de se connecter et d'ajouter des publications à l'aide des fonctionnalités de Firebase Realtime Database.

Vous pouvez également adapter les étapes de cet atelier de programmation pour tester votre propre application.

Conditions préalables

Ce dont vous aurez besoin

2. Créez un fournisseur d'attestation personnalisé

Au cours de cette étape, nous allons créer une classe de fournisseur personnalisée pour fournir un jeton uniquement lorsque l'attestation d'application est activée. Remote Config s'appuie sur une instance d'application Firebase configurée, et le fournisseur personnalisé que vous implémentez à cette étape fait office d'espace réservé pour terminer la configuration.

Pour effectuer les étapes suivantes, vous devrez ajouter Firebase , FirebaseRemoteConfig et FirebaseAnalytics dans la section Frameworks, Libraries and Embedded Content de votre application dans Xcode. Pour un exemple de la façon de procéder, reportez-vous à l' atelier de programmation de vérification de l'application Firebase pour les plates-formes Apple .

  1. Créez un fichier " MyAppCheckProvider " qui est une sous-classe de NSObject conforme au protocole AppCheckProvider .
  2. Incluez une méthode getToken() vide que vous remplirez plus tard.

Consultez l’exemple de code suivant pour la classe de fournisseur personnalisé avec la méthode getToken() vide.

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}

Pour instancier AppAttestProvider , vous devrez transmettre une instance du FirebaseApp correspondant. Créez une propriété stockée pour celui-ci et acceptez-la comme paramètre d'initialisation :

// 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) {}
}

Transférer la demande de jeton au fournisseur d'attestation d'application

Vous avez maintenant tout pour transmettre la demande de jeton au fournisseur App Attest dans votre méthode getToken() .

Remarque : Apprenez-en davantage sur la méthode getToken() dans la référence du framework FirebaseAppCheck .

Ajoutez le code suivant à votre méthode 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)
}

Le code précédent vérifie un paramètre booléen Remote Config AppAttestEnabled (ce paramètre Remote Config sera créé ultérieurement dans l'atelier de programmation). Si la valeur est fausse, le code échoue, indiquant qu'App Check n'est pas déployé sur l'appareil actuel. Si la valeur est vraie, le code tente d’obtenir un fournisseur d’attestation d’application et échoue s’il n’y parvient pas. Si ces contrôles d'erreur sont réussis, le code transmettra la demande de jeton au fournisseur d'attestation d'application.

Ajouter des événements Analytics

En ajoutant des événements Analytics, vous obtenez de meilleures informations sur le succès du déploiement d'App Check. Analytics aidera à déterminer si l'attestation d'application doit être activée pour un public plus large.

Enregistrez deux événements Analytics : AppAttestSuccess en cas de réussite et AppAttestFailure en cas d'échec. Ces deux événements Analytics peuvent vous aider à suivre le succès de votre déploiement App Check et à décider si un déploiement à plus grande échelle doit avoir lieu.

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. Mettez à jour la classe Provider Factory

Après avoir implémenté la logique permettant de transmettre la demande de jeton au fournisseur App Attest et ajouté certains événements Analytics, vous devez mettre à jour MyAppCheckProviderFactory.class que vous avez créé dans l' atelier de programmation App Check pour les plates-formes Apple . Cette classe ciblera le fournisseur de débogage App Check pour les simulateurs et, dans le cas contraire, ciblera votre fournisseur personnalisé.

Modifiez le code suivant dans la classe MyAppCheckProviderFactory que vous avez créée dans l' atelier de programmation Firebase App Check pour les plates-formes Apple :

// 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
  }
}

Confirmez que vous avez défini AppCheckProviderFactory avant de configurer FirebaseApp :

// DatabaseExampleApp.swift

import SwiftUI
import Firebase
import FirebaseAppCheck

@main
struct DatabaseExampleApp: App {
  init() {
    AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
    FirebaseApp.configure()
  }

  // ...
}

4. Ajoutez un paramètre Remote Config dans la console Firebase

Vous allez maintenant ajouter le paramètre Remote Config AppAttestEnabled à la console Firebase. Votre méthode getToken nécessite ce paramètre.

Pour créer un paramètre Remote Config dans la console Firebase :

  1. Ouvrez Remote Config pour votre projet et cliquez sur Ajouter un paramètre . Si c'est la première fois que vous utilisez Remote Config, cliquez sur Créer une configuration .
  2. Dans le champ Nom du paramètre (clé) , entrez AppAttestEnabled .
  3. Dans la liste déroulante Type de données , sélectionnez Boolean .
  4. Dans la liste déroulante Valeur par défaut , sélectionnez false .

Création d'un paramètre de configuration à distance dans la console Firebase

Avant de cliquer sur Enregistrer, créez une valeur conditionnelle pour 10 % des utilisateurs :

  1. Cliquez sur Ajouter nouveau > Valeur conditionnelle > Créer une nouvelle condition .
  2. Dans le champ Nom , saisissez un nom de condition.
  3. Sous S'applique si... , sélectionnez Utilisateur dans un centile aléatoire , <= , puis entrez 10 dans le champ % .
  4. Cliquez sur Créer une condition .

Définir une condition de configuration à distance dans la console Firebase

Définissez la valeur conditionnelle sur true afin que l'attestation d'application soit déployée auprès de 10 % de vos utilisateurs.

  1. Définissez la valeur sur true pour la condition que vous venez de créer.
  2. Cliquez sur Enregistrer .

Examen du paramètre Remote Config dans la console Firebase

Lorsque vous avez terminé, publiez les modifications de Remote Config.

Testez le déploiement sur votre appareil

Pour tester les différentes valeurs de l'indicateur Remote Config sur votre appareil sans modifier le code de l'application, configurez une expérience sur le paramètre AppAttestEnabled en suivant le didacticiel Créer des expériences de configuration à distance Firebase avec des tests A/B . La section tutoriel " Validez votre expérience sur un appareil de test " explique comment attribuer différentes valeurs à votre appareil de test.

La dernière étape consiste à utiliser Google Analytics pour surveiller le succès du déploiement de votre attestation d'application.

5. Vérifiez le succès de votre déploiement AppCheck

Vous pouvez mesurer le succès de votre déploiement sur le tableau de bord Analytics Events. Surveillez les événements AppAttestSuccess et AppAttestFailure . L'affichage des événements dans le tableau de bord peut prendre jusqu'à 24 heures. Vous pouvez également activer le débogage et utiliser DebugView pour afficher plus rapidement les événements de débogage.

En option, vous pouvez surveiller le tableau de bord Crashlytics pour détecter l'augmentation des taux de crash. Pour plus d'informations sur l'ajout de Crashlytics à votre application, consultez Premiers pas avec Firebase Crashlytics .

Une fois que vous voyez principalement des événements AppAttestSuccess et quelques événements AppAttestFailure , c'est un bon signe que vous pouvez augmenter le pourcentage d'utilisateurs avec App Attest activé en modifiant la condition dans le paramètre Remote Config AppAttestEnabled .

Examiner les événements Analytics dans la console Firebase

Facultatif : exploiter l'audience de Google Analytics

Si vous souhaitez exploiter davantage l'événement AppAttestEnabled Analytics, vous pouvez créer une audience Analytics pour suivre les utilisateurs avec AppAttestEnabled défini sur true.

L'attestation d'application a été publiée avec iOS 14.0. Certains de vos utilisateurs peuvent ne pas figurer sur cette version et ne pas donc être éligibles à l'attestation d'application. Vous pouvez enregistrer un autre événement Analytics pour suivre ces utilisateurs, puis cibler cette audience pour une autre méthode d'attestation, telle que DeviceCheck .

Facultatif : utilisez Crashlytics pour surveiller les plantages

Pour mieux comprendre la stabilité de votre application lors du déploiement, utilisez Firebase Crashlytics pour surveiller les plantages et les incidents non mortels.

6. Félicitations !

Vous avez déployé avec succès App Check avec Remote Config 🎉

Ressources additionnelles: