1. Introduzione
Puoi utilizzare Firebase App Check con App Attest per proteggere i tuoi servizi di backend e verificare che le richieste ai servizi Firebase provengano dalla tua app autentica.
In genere è consigliabile eseguire l'onboarding degli utenti gradualmente al servizio App Attest per evitare di raggiungere i limiti di quota. Per saperne di più, consulta la documentazione di Apple "Preparing to Use the App Attest Service".
La possibilità di rilasciare aggiornamenti incrementali delle app utilizzando la funzionalità App Store Connect di Apple, come descritto in "Rilasciare un aggiornamento di versione in fasi ", può rendere più semplice l'implementazione di App Check. Si tratta di una soluzione semplice e diretta. Tuttavia, il rilascio di un aggiornamento della versione dell'app in più fasi non ti consente di controllare l'implementazione o modificare il comportamento delle app esistenti e aggiornate senza pubblicare una nuova versione dell'app.
Un modo per avere un maggiore controllo sull'implementazione di App Check con App Attest è utilizzare Firebase Remote Config per attivare App Check con App Attest per una percentuale di utenti dell'app alla volta. In questo modo, è possibile evitare la limitazione da parte dei server di attestazione. Google Analytics può essere utilizzato per osservare l'impatto dell'implementazione sugli utenti.
Cosa imparerai a fare
In questo codelab in più passaggi, imparerai a utilizzare Firebase Remote Config per implementare App Check per la tua app.
Questo codelab utilizza un progetto Firebase basato sull'app di avvio rapido DatabaseExample e integrato con Firebase App Check, come descritto nel codelab Firebase App Check per le piattaforme Apple. L'app di avvio rapido DatabaseExample consente agli utenti di accedere e aggiungere post utilizzando le funzionalità di Firebase Realtime Database.
Puoi anche adattare i passaggi di questo codelab per testare la tua app.
Prerequisiti
- Completamento del codelab Firebase App Check per le piattaforme Apple
Che cosa ti serve
- Xcode 12.5 o versioni successive
- Per i test di App Attest:
- Un account sviluppatore Apple che ti consenta di creare nuovi identificatori app
- Un'applicazione con un ID app esplicito con la funzionalità App Attest abilitata. Se hai bisogno di aiuto per la procedura, consulta gli articoli Registrare un ID app e Attivare le funzionalità dell'app.
- Un dispositivo iOS/iPadOS che supporta App Attest
- Progetto Firebase con:
- Un'app per iOS configurata (scopri di più)
- Google Analytics, Remote Config e App Check abilitati
- Accesso al progetto Firebase associato alla tua app, con autorizzazioni per usare e gestire Remote Config e visualizzare Google Analytics
2. Crea un fornitore di attestazioni personalizzato
In questo passaggio, creeremo una classe di provider personalizzata per fornire un token solo quando App Attest è abilitato. Remote Config si basa su un'istanza dell'app Firebase configurata e il provider personalizzato che implementi in questo passaggio funge da segnaposto per completare la configurazione.
Per completare i passaggi seguenti, devi aggiungere Firebase
, FirebaseRemoteConfig
e FirebaseAnalytics
nella sezione Framework, librerie e contenuti incorporati della tua app in Xcode. Per un esempio di come farlo, consulta il codelab su Firebase App Check per le piattaforme Apple.
- Crea un file "MyAppCheckProvider" che sia una sottoclasse di
NSObject
conforme al protocolloAppCheckProvider
. - Includi un metodo
getToken()
vuoto che compilerai in un secondo momento.
Vedi il seguente esempio di codice per la classe del fornitore personalizzato con il metodo getToken()
vuoto.
// MyAppCheckProvider.swift
import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig
class MyAppCheckProvider: NSObject, AppCheckProvider {
func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}
Per creare un'istanza di AppAttestProvider
, devi trasmettere un'istanza del FirebaseApp
corrispondente. Crea una proprietà archiviata e accettala come parametro di inizializzazione:
// 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) {}
}
Inoltra la richiesta di token al provider App Attest
Ora hai tutto il necessario per inoltrare la richiesta di token al fornitore di App Attest nel tuo metodo getToken()
.
Nota: scopri di più sul metodo getToken()
nel riferimento al framework FirebaseAppCheck.
Aggiungi il seguente codice al metodo 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)
}
Il codice precedente controlla un parametro booleano AppAttestEnabled
di Remote Config (questo parametro di Remote Config verrà creato più avanti nel codelab). Se il valore è false, il codice non viene eseguito, il che indica che App Check non è implementato sul dispositivo corrente. Se il valore è true, il codice tenta di ottenere un provider App Attest e non riesce se non può. Se questi controlli degli errori vengono superati, il codice inoltrerà la richiesta di token al fornitore di App Attest.
Aggiungere eventi Analytics
Se aggiungi eventi Analytics, ottieni informazioni migliori sul successo dell'implementazione di App Check. Analytics ti aiuterà a determinare se App Attest deve essere attivato per un pubblico più ampio.
Registra due eventi Analytics: AppAttestSuccess in caso di esito positivo e AppAttestFailure in caso di esito negativo. Questi due eventi Analytics possono aiutarti a monitorare l'esito dell'implementazione del controllo app e a decidere se procedere con un'implementazione più ampia.
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. Aggiorna la classe Provider Factory
Dopo aver implementato la logica per inoltrare la richiesta di token al provider App Attest e aver aggiunto alcuni eventi Analytics, devi aggiornare MyAppCheckProviderFactory.class
che hai creato nel codelab App Check per le piattaforme Apple. Questa classe avrà come target il provider di debug App Check per i simulatori, altrimenti avrà come target il tuo provider personalizzato.
Modifica il seguente codice nella classe MyAppCheckProviderFactory
che hai creato nel codelab Firebase App Check per le piattaforme 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
}
}
Prima di configurare FirebaseApp
, verifica di aver impostato AppCheckProviderFactory
:
// DatabaseExampleApp.swift
import SwiftUI
import Firebase
import FirebaseAppCheck
@main
struct DatabaseExampleApp: App {
init() {
AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
FirebaseApp.configure()
}
// ...
}
4. Aggiungere un parametro Remote Config nella console Firebase
Ora aggiungi il parametro Remote Config AppAttestEnabled alla console Firebase . Il metodo getToken
richiede questo parametro.
Per creare un parametro Remote Config nella console Firebase :
- Apri Remote Config per il tuo progetto e fai clic su Aggiungi parametro. Se è la prima volta che utilizzi Remote Config, fai clic su Crea configurazione.
- Nel campo Nome parametro (chiave), inserisci
AppAttestEnabled
. - Dal menu a discesa Tipo di dati, seleziona Booleano.
- Nel menu a discesa Valore predefinito, seleziona false.
Prima di fare clic su Salva, crea un valore condizionale per il 10% degli utenti:
- Fai clic su Aggiungi nuovo > Valore condizionale > Crea nuova condizione.
- Nel campo Nome, inserisci un nome per la condizione.
- Nella sezione Si applica se…, seleziona Utente in percentile casuale, <= e poi inserisci 10 nel campo %.
- Fai clic su Crea condizione.
Imposta il valore condizionale su true in modo che App Attest venga implementato per il 10% dei tuoi utenti.
- Imposta il valore su true per la condizione appena creata.
- Fai clic su Salva.
Al termine, pubblica le modifiche di Remote Config.
Testare l'implementazione sul dispositivo
Per testare i diversi valori dei flag di Remote Config sul tuo dispositivo senza modificare il codice dell'app, configura un esperimento sul parametro AppAttestEnabled seguendo il tutorial Creare esperimenti di Firebase Remote Config con A/B Testing. La sezione del tutorial "Convalida l'esperimento su un dispositivo di test" spiega come assegnare valori diversi per il dispositivo di test.
Il passaggio finale consiste nell'utilizzare Google Analytics per monitorare l'efficacia dell'implementazione di App Attest.
5. Controllare l'esito dell'implementazione di AppCheck
Puoi misurare l'efficacia dell'implementazione nella dashboard Eventi Analytics. Controlla gli eventi AppAttestSuccess e AppAttestFailure. Potrebbero essere necessarie fino a 24 ore prima che gli eventi vengano visualizzati nella dashboard. In alternativa, puoi attivare il debug e utilizzare DebugView per visualizzare più rapidamente gli eventi di debug.
Se vuoi, puoi monitorare la dashboard di Crashlytics per verificare eventuali aumenti dei tassi di arresto anomalo. Per saperne di più sull'aggiunta di Crashlytics alla tua app, consulta Come iniziare a utilizzare Firebase Crashlytics.
Quando visualizzi principalmente eventi AppAttestSuccess e pochi eventi AppAttestFailure, è un buon segno che puoi aumentare la percentuale di utenti con App Attest attivato modificando la condizione nel parametro Remote Config AppAttestEnabled.
(Facoltativo) Sfrutta il segmento di pubblico di Google Analytics
Se vuoi sfruttare ulteriormente l'evento Analytics AppAttestEnabled, puoi creare un segmento di pubblico Analytics per monitorare gli utenti con AppAttestEnabled impostato su true.
App Attest è stato rilasciato con iOS 14.0. Alcuni dei tuoi utenti potrebbero non utilizzare questa release e quindi non essere idonei per App Attest. Puoi registrare un altro evento Analytics per monitorare questi utenti, quindi scegliere come target questo segmento di pubblico per un altro metodo di attestazione, ad esempio DeviceCheck.
(Facoltativo) Utilizzare Crashlytics per monitorare gli arresti anomali
Per comprendere meglio la stabilità della tua app durante l'implementazione, utilizza Firebase Crashlytics per monitorare gli arresti anomali e gli errori non irreversibili.
6. Complimenti!
Hai implementato correttamente App Check con Remote Config 🎉