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

1. Wprowadzenie

Za pomocą Sprawdzania aplikacji Firebase z aplikacją App Attest możesz chronić usługi backendu i sprawdzać, czy żądania wysyłane do usług Firebase pochodzą z autentycznej aplikacji.

Ogólnie zalecamy stopniowe wprowadzanie użytkowników w usłudze App Attest, aby uniknąć osiągnięcia limitów. Więcej informacji znajdziesz w przewodniku firmy Apple „Prepare to Use the App Attest Service” (Przygotowanie do użycia usługi App Attest Service) dokumentacji.

możliwość stopniowego publikowania aktualizacji aplikacji za pomocą funkcji Apple App Store Connect, jak opisano w sekcji „Publikowanie aktualizacji wersji stopniowo”, może usprawnić wdrażanie Sprawdzania aplikacji. To proste i proste rozwiązanie. Publikowanie aktualizacji wersji aplikacji etapami nie daje jednak możliwości kontrolowania wdrażania ani zmieniania zachowania istniejących, zaktualizowanych aplikacji bez publikowania nowej wersji.

Jednym ze sposobów na większą kontrolę nad wdrażaniem funkcji Sprawdzanie aplikacji za pomocą App Attest jest użycie Zdalnej konfiguracji Firebase do włączenia Sprawdzania aplikacji za pomocą App Attest dla pewnego odsetka użytkowników aplikacji naraz. Może to pomóc uniknąć ograniczania przepustowości z serwerów atestu. Za pomocą Google Analytics można obserwować wpływ wdrożenia na użytkowników.

Czego się nauczysz

Z tego wieloetapowego ćwiczenia w Codelabs dowiesz się, jak wdrożyć Kontrolę aplikacji za pomocą Zdalnej konfiguracji Firebase.

W ramach tego ćwiczenia w Codelabs korzystamy z projektu Firebase opartego na krótkiej aplikacji DatabaseExample i jest zintegrowany z Firebase App Check zgodnie z opisem w ćwiczeniu z programowania Firebase App Check for Apple Platforms. 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 tego ćwiczenia z programowania, aby przetestować własną aplikację.

Wymagania wstępne

Czego potrzebujesz

2. Tworzenie niestandardowego dostawcy atestu

W tym kroku utworzymy niestandardową klasę dostawcy, która będzie udostępniać token tylko wtedy, gdy włączony jest App Attest. Zdalna konfiguracja korzysta ze skonfigurowanej instancji aplikacji Firebase, a dostawca niestandardowy zaimplementowany w tym kroku pełni rolę obiektu zastępczego, który kończy konfigurację.

Aby wykonać poniższe czynności, musisz dodać pakiety Firebase, FirebaseRemoteConfig i FirebaseAnalytics w sekcji Ramki, biblioteki i umieszczone treści aplikacji w Xcode. Przykład znajdziesz w ćwiczeniu z programowania poświęconym sprawdzaniu aplikacji Firebase na platformach Apple.

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

Poniżej znajdziesz przykładowy kod klasy dostawcy niestandardowego 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ć wystąpienie odpowiedniego elementu FirebaseApp. Utwórz dla niej zapisaną właściwość i zaakceptuj ją jako parametr inicjatora:

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

Przekaż żądanie tokena do dostawcy App Attest

Masz już wszystko, co możesz zrobić, aby przekazywać żądanie tokena do dostawcy App Attest w metodzie getToken().

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

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 zostanie utworzony później w ramach ćwiczeń z programowania). Jeśli wartość to „false”, kod wypadnie niepowodzeniem, co będzie oznaczało, że na bieżącym urządzeniu nie zostało wdrożone Sprawdzanie aplikacji. Jeśli wartość to true (prawda), kod próbuje uzyskać dostawcę App Attest i kończy się niepowodzeniem, jeśli to niemożliwe. Jeśli te testy błędów zostaną zaliczone, kod przekaże żądanie tokena do dostawcy App Attest.

Dodawanie zdarzeń Analytics

Dzięki dodaniu zdarzeń Analytics masz lepszy wgląd w skuteczność wdrożenia funkcji Sprawdzanie aplikacji. Analytics pomoże 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 zdarzenia Analytics pomagają śledzić udane wdrożenie funkcji Sprawdzanie aplikacji i podejmować decyzję, czy należy przeprowadzić większe 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 zaimplementowaniu i zaimplementowaniu logiki przekazywania żądania tokena do dostawcy App Attest i dodaniu zdarzeń Analytics musisz zaktualizować MyAppCheckProviderFactory.class utworzony w ramach ćwiczenia z programowania Sprawdzania aplikacji dla platform Apple. Ta klasa będzie kierowana na dostawcę debugowania Sprawdzania aplikacji w przypadku symulatorów lub w innym przypadku na dostawcę niestandardowego.

Edytuj ten kod w klasie MyAppCheckProviderFactory utworzonej w ramach ćwiczenia z programowania na platformach Apple w ramach Sprawdzania aplikacji Firebase:

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

Zanim skonfigurujesz FirebaseApp, potwierdź, że AppCheckProviderFactory:

// DatabaseExampleApp.swift

import SwiftUI
import Firebase
import FirebaseAppCheck

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

  // ...
}

4. Dodaj parametr Zdalnej konfiguracji w konsoli Firebase.

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ę dla swojego projektu i kliknij Dodaj parametr. Jeśli po raz pierwszy używasz Zdalnej konfiguracji, kliknij Utwórz konfigurację.
  2. W polu Nazwa parametru (klucz) wpisz AppAttestEnabled.
  3. W menu Typ danych wybierz Wartość logiczna.
  4. Z menu Wartość domyślna wybierz fałsz.

Tworzę parametr 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 Dotyczy, jeśli... wybierz Użytkownik w losowym percentylu, <=, a następnie wpisz 10 w polu %.
  4. Kliknij Utwórz warunek.

Definiowanie warunku Zdalnej konfiguracji w konsoli Firebase

Ustaw wartość warunkową na true, aby aplikacja App Attest była wdrażana u 10% użytkowników.

  1. Dla utworzonego właśnie warunku ustaw wartość true (prawda).
  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 flag Zdalnej konfiguracji na urządzeniu bez modyfikowania kodu aplikacji, skonfiguruj eksperyment z parametrem AppAttestEnabled zgodnie z samouczkiem dotyczącym tworzenia eksperymentów Zdalnej konfiguracji Firebase z Testami A/B. Sekcja samouczka „Weryfikacja eksperymentu na urządzeniu testowym” wyjaśnia, jak przypisać różne wartości do urządzenia testowego.

Ostatnim krokiem jest użycie Google Analytics do monitorowania powodzenia wdrożenia App Attest.

5. Sprawdzanie powodzenia wdrożenia AppCheck

Pomyślne wyniki wdrożenia możesz sprawdzać w panelu Zdarzenia w Analytics. Obserwuj zdarzenia AppAttestSuccess i AppAttestFailure. Zanim zdarzenia pojawią się w panelu, może upłynąć do 24 godzin. Możesz też włączyć debugowanie i użyć raportu DebugView, aby szybciej przeglądać zdarzenia debugowania.

Opcjonalnie możesz monitorować w panelu Crashlytics wzrost częstotliwości awarii. Więcej informacji o dodawaniu Crashlytics do aplikacji znajdziesz w artykule Pierwsze kroki z Firebase Crashlytics.

Jeśli zobaczysz głównie zdarzenia AppAttestSuccess i niewiele zdarzeń AppAttestFailure, oznacza to, że możesz zwiększyć odsetek użytkowników z włączonym App Attest. W tym celu zmień warunek w parametrze Zdalnej konfiguracji AppAttestEnabled.

Wyświetlanie zdarzeń Analytics w konsoli Firebase

Opcjonalnie: korzystanie z list odbiorców Google Analytics

Jeśli chcesz jeszcze bardziej korzystać ze zdarzenia Analytics AppAttestEnabled, możesz utworzyć listę odbiorców Analytics, aby śledzić użytkowników z ustawieniem AppAttestEnabled ustawioną na wartość „true”.

Aplikacja App Attest została opublikowana w wersji 14.0 na iOS. Niektórzy użytkownicy mogą nie używać tej wersji, więc nie mogą korzystać z App Attest. Możesz zarejestrować kolejne zdarzenie Analytics, aby śledzić tych użytkowników, a następnie ustawić kierowanie na tę grupę odbiorców za pomocą innej metody poświadczania, np. DeviceCheck.

Opcjonalnie: monitorowanie awarii przy użyciu Crashlytics

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

6. Gratulacje!

Udało Ci się wdrożyć Sprawdzanie aplikacji za pomocą Zdalnej konfiguracji 🎉

Dodatkowe zasoby