Stopniowo wdrażaj Sprawdzanie aplikacji Firebase za pomocą Zdalnej konfiguracji Firebase

1. Wprowadzenie

Możesz używać Sprawdzania aplikacji Firebase z App Attest, aby chronić usługi backendu i sprawdzać, czy żądania do usług Firebase pochodzą z Twojej autentycznej aplikacji.

Zalecamy stopniowe wdrażanie usługi App Attest, aby uniknąć przekroczenia limitów. Więcej informacji znajdziesz w dokumentacji Apple „Przygotowanie do korzystania z usługi App Attest”.

Możliwość stopniowego publikowania aktualizacji aplikacji za pomocą funkcji App Store Connect od Apple, zgodnie z opisem w artykule „Stopniowe publikowanie aktualizacji wersji”, może ułatwić wdrażanie App Check. To proste rozwiązanie. Wprowadzanie aktualizacji wersji aplikacji etapami nie pozwala jednak kontrolować wdrażania ani zmieniać zachowania istniejących, zaktualizowanych aplikacji bez publikowania nowej wersji aplikacji.

Jednym ze sposobów na większą kontrolę nad wdrażaniem Sprawdzania aplikacji z App Attest jest użycie Zdalnej konfiguracji Firebase, aby włączać Sprawdzanie aplikacji z App Attest dla określonego odsetka użytkowników aplikacji. Może to pomóc uniknąć ograniczania przepustowości przez serwery atestacyjne. Google Analytics może służyć do obserwowania wpływu wdrożenia na użytkowników.

Czego się nauczysz

Z tego wieloetapowego laboratorium kodowania dowiesz się, jak używać Zdalnej konfiguracji Firebase do wdrażania weryfikacji aplikacji w swojej aplikacji.

W tym samouczku wykorzystujemy projekt Firebase oparty na aplikacji DatabaseExample z szybkim startem i zintegrowany z Firebase App Check, zgodnie z opisem w samouczku Firebase App Check na platformy Apple. Aplikacja DatabaseExample umożliwia użytkownikom logowanie się i dodawanie postów za pomocą funkcji Bazy danych czasu rzeczywistego Firebase.

Możesz też dostosować kroki opisane w tym ćwiczeniu, aby przetestować własną aplikację.

Wymagania wstępne

Czego potrzebujesz

  • Xcode 12.5 lub nowszy
  • W przypadku testowania App Attest:
    • Konto Apple Developer, które umożliwia tworzenie nowych identyfikatorów aplikacji.
    • Aplikacja z wyraźnym identyfikatorem aplikacji, w której włączono funkcję App Attest. Jeśli potrzebujesz pomocy w tym procesie, zapoznaj się z artykułami Rejestrowanie identyfikatora aplikacjiWłączanie funkcji aplikacji.
    • urządzenie z iOS lub iPadOS, które obsługuje App Attest;
  • Projekt Firebase z:
  • Dostęp do powiązanego projektu Firebase aplikacji z uprawnieniami do tworzenia Zdalnej konfiguracji i zarządzania nią oraz do wyświetlania danych Google Analytics.

2. Tworzenie niestandardowego dostawcy atestów

W tym kroku utworzymy niestandardową klasę dostawcy, która będzie udostępniać token tylko wtedy, gdy weryfikacja aplikacji jest włączona. Zdalna konfiguracja korzysta ze skonfigurowanej instancji aplikacji Firebase, a zastosowany w tym kroku dostawca niestandardowy pełni rolę elementu zastępczego, który umożliwia dokończenie konfiguracji.

Aby wykonać poniższe czynności, musisz dodać Firebase, FirebaseRemoteConfigFirebaseAnalytics w sekcji Frameworks, Libraries, and Embedded Content (Frameworki, biblioteki i treści osadzone) w aplikacji w Xcode. Przykład znajdziesz w ćwiczeniu dotyczącym sprawdzania aplikacji Firebase na platformach Apple.

  1. Utwórz plik „MyAppCheckProvider”, który jest podklasą klasy NSObject zgodną z protokołem AppCheckProvider.
  2. Dodaj pustą metodę getToken(), którą wypełnisz później.

Poniżej znajdziesz przykładowy kod klasy niestandardowego dostawcy z pustą metodą getToken().

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

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

Aby utworzyć instancję AppAttestProvider, musisz przekazać instancję odpowiedniego elementu FirebaseApp. Utwórz dla niego przechowywaną właściwość i zaakceptuj ją jako parametr inicjujący:

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

Przekazywanie żądania tokena do dostawcy App Attest

Masz już wszystko, co jest potrzebne do przekazania żądania tokena dostawcy App Attest w metodzie getToken().

Uwaga: więcej informacji o metodzie getToken() znajdziesz w dokumentacji FirebaseAppCheck Framework Reference.

Dodaj ten kod do metody 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)
}

Poprzedni kod sprawdza parametr logiczny AppAttestEnabled Zdalnej konfiguracji (ten parametr Zdalnej konfiguracji zostanie utworzony później w tym samouczku). Jeśli wartość to „false”, kod nie działa, co oznacza, że weryfikacja aplikacji nie jest wdrożona na bieżącym urządzeniu. Jeśli wartość to „true”, kod próbuje uzyskać dostawcę App Attest i nie udaje mu się to. Jeśli te kontrole błędów zostaną zaliczone, kod przekaże żądanie tokena do dostawcy App Attest.

Dodawanie zdarzeń Analytics

Dodanie zdarzeń Analytics pozwoli Ci lepiej ocenić skuteczność wdrożenia Sprawdzania aplikacji. Analytics pomoże Ci określić, czy należy włączyć App Attest dla większej grupy odbiorców.

Zarejestruj 2 zdarzenia Analytics: AppAttestSuccess w przypadku powodzenia i AppAttestFailure w przypadku niepowodzenia. Te 2 wydarzenia w Analytics mogą pomóc w śledzeniu skuteczności wdrażania usługi App Check i podjęciu decyzji, czy należy przeprowadzić szersze wdrożenie.

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. Aktualizowanie klasy Provider Factory

Po wdrożeniu logiki przekazywania żądania tokena do dostawcy App Attest i dodaniu niektórych zdarzeń Analytics musisz zaktualizować MyAppCheckProviderFactory.class, który został utworzony w samouczku App Check na platformy Apple. Ta klasa będzie kierowana na dostawcę debugowania App Check w przypadku symulatorów, a w innych przypadkach na dostawcę niestandardowego.

Edytuj ten kod w klasie MyAppCheckProviderFactory utworzonej w samouczku dotyczącym sprawdzania aplikacji Firebase na platformach 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
  }
}

Przed skonfigurowaniem FirebaseApp upewnij się, że masz ustawione AppCheckProviderFactory:

// DatabaseExampleApp.swift

import SwiftUI
import Firebase
import FirebaseAppCheck

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

  // ...
}

4. Dodawanie parametru Zdalnej konfiguracji w konsoli Firebase

Teraz dodaj do konsoli Firebase parametr Zdalnej konfiguracji AppAttestEnabled . Metoda getToken wymaga tego parametru.

Aby utworzyć parametr Zdalnej konfiguracji w konsoli Firebase :

  1. Otwórz Zdalną konfigurację w swoim projekcie i kliknij Dodaj parametr. Jeśli korzystasz z Konfiguracji zdalnej po raz pierwszy, kliknij Utwórz konfigurację.
  2. W polu Nazwa parametru (klucz) wpisz AppAttestEnabled.
  3. W menu Typ danych wybierz Wartość logiczna.
  4. W menu Wartość domyślna wybierz false.

Tworzenie parametru Zdalnej konfiguracji w konsoli Firebase

Zanim klikniesz Zapisz, utwórz wartość warunkową dla 10% użytkowników:

  1. Kliknij Dodaj nowy > Wartość warunkowa > Utwórz nowy warunek.
  2. W polu Nazwa wpisz nazwę warunku.
  3. W sekcji Obowiązuje, jeśli... wybierz Użytkownik w losowym przedziale procentowym, <=, a potem w polu % wpisz 10.
  4. Kliknij Utwórz warunek.

Określanie warunku Zdalnej konfiguracji w konsoli Firebase

Ustaw wartość warunkową na true, aby funkcja App Attest została wdrożona u 10% użytkowników.

  1. Ustaw wartość warunku, który właśnie został utworzony, na true.
  2. Kliknij Zapisz.

Sprawdzanie parametru Zdalnej konfiguracji w konsoli Firebase

Gdy skończysz, opublikuj zmiany w Zdalnej konfiguracji.

Testowanie wdrożenia na urządzeniu

Aby przetestować różne wartości flagi Zdalnej konfiguracji na urządzeniu bez modyfikowania kodu aplikacji, skonfiguruj eksperyment na parametrze AppAttestEnabled, postępując zgodnie z samouczkiem Tworzenie eksperymentów Zdalnej konfiguracji Firebase z testami A/B. W sekcji samouczka „Sprawdzanie eksperymentu na urządzeniu testowym” znajdziesz informacje o tym, jak przypisywać różne wartości do urządzenia testowego.

Ostatnim krokiem jest użycie Google Analytics do monitorowania skuteczności wdrożenia App Attest.

5. Sprawdzanie skuteczności wdrożenia AppCheck

Skuteczność wdrożenia możesz mierzyć w panelu Zdarzenia Analytics. Obserwuj zdarzenia AppAttestSuccessAppAttestFailure. Zanim zdarzenia pojawią się na panelu, może minąć do 24 godzin. Możesz też włączyć debugowanie i użyć DebugView, aby szybciej wyświetlać zdarzenia debugowania.

Opcjonalnie możesz monitorować panel Crashlytics pod kątem wzrostu liczby awarii. Więcej informacji o dodawaniu Crashlytics do aplikacji znajdziesz w artykule Rozpoczynanie korzystania z Firebase Crashlytics.

Gdy zobaczysz głównie zdarzenia AppAttestSuccess i niewiele zdarzeń AppAttestFailure, będzie to dobry znak, że możesz zwiększyć odsetek użytkowników z włączoną funkcją App Attest, modyfikując warunek w parametrze konfiguracji zdalnej AppAttestEnabled.

Sprawdzanie zdarzeń Analytics w konsoli Firebase

Opcjonalnie: korzystaj z list odbiorców Google Analytics

Jeśli chcesz w pełni wykorzystać zdarzenie Analytics AppAttestEnabled, możesz utworzyć listę odbiorców Analytics, aby śledzić użytkowników, u których parametr AppAttestEnabled ma wartość „true”.

App Attest został udostępniony w iOS 14.0. Niektórzy użytkownicy mogą nie korzystać z tej wersji, a tym samym nie kwalifikować się do korzystania z App Attest. Aby śledzić tych użytkowników, możesz zarejestrować kolejne zdarzenie Analytics, a następnie kierować na tę grupę odbiorców inną metodę atestacji, np. DeviceCheck.

Opcjonalnie: użyj Crashlytics do monitorowania awarii

Aby lepiej poznać stabilność aplikacji podczas wdrażania, używaj Firebase Crashlytics do monitorowania awarii i błędów niekrytycznych.

6. Gratulacje!

Sprawdzanie aplikacji zostało wdrożone za pomocą Zdalnej konfiguracji 🎉

Dodatkowe zasoby