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 aplikacji i Włączanie funkcji aplikacji.
- urządzenie z iOS lub iPadOS, które obsługuje App Attest;
- Projekt Firebase z:
- skonfigurowana aplikacja na iOS (więcej informacji);
- Google Analytics, Zdalna konfiguracja i Weryfikacja aplikacji są włączone.
- 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
, FirebaseRemoteConfig
i FirebaseAnalytics
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.
- Utwórz plik „MyAppCheckProvider”, który jest podklasą klasy
NSObject
zgodną z protokołemAppCheckProvider
. - 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 :
- Otwórz Zdalną konfigurację w swoim projekcie i kliknij Dodaj parametr. Jeśli korzystasz z Konfiguracji zdalnej po raz pierwszy, kliknij Utwórz konfigurację.
- W polu Nazwa parametru (klucz) wpisz
AppAttestEnabled
. - W menu Typ danych wybierz Wartość logiczna.
- W menu Wartość domyślna wybierz false.
Zanim klikniesz Zapisz, utwórz wartość warunkową dla 10% użytkowników:
- Kliknij Dodaj nowy > Wartość warunkowa > Utwórz nowy warunek.
- W polu Nazwa wpisz nazwę warunku.
- W sekcji Obowiązuje, jeśli... wybierz Użytkownik w losowym przedziale procentowym, <=, a potem w polu % wpisz 10.
- Kliknij Utwórz warunek.
Ustaw wartość warunkową na true, aby funkcja App Attest została wdrożona u 10% użytkowników.
- Ustaw wartość warunku, który właśnie został utworzony, na true.
- Kliknij Zapisz.
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 AppAttestSuccess i AppAttestFailure. 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.
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 🎉