了解 2023 年 Google I/O 大会上介绍的 Firebase 亮点。了解详情

Collega la tua app all'emulatore di autenticazione

Prima di utilizzare l'emulatore di autenticazione con la tua app, assicurati di comprendere il flusso di lavoro generale di Firebase Local Emulator Suite e di installare e configurare Local Emulator Suite e di rivedere i suoi comandi CLI .

Questo argomento presuppone che tu abbia già familiarità con lo sviluppo di soluzioni di autenticazione Firebase per la produzione. Se necessario, consulta la documentazione per la tua combinazione di piattaforma e tecnica di autenticazione .

Cosa posso fare con l'emulatore di autenticazione?

L'emulatore di autenticazione fornisce un'emulazione locale ad alta fedeltà dei servizi di autenticazione Firebase, fornendo gran parte delle funzionalità presenti nell'autenticazione Firebase di produzione . Abbinato alle piattaforme Apple, Android e Web Firebase SDK, l'emulatore ti consente di:

  • Crea, aggiorna e gestisci account utente emulati per testare e-mail/password, numero di telefono/SMS, SMS a più fattori e autenticazione del provider di identità di terze parti (ad es. Google)
  • Visualizza e modifica gli utenti emulati
  • Prototipazione di sistemi di autenticazione token personalizzati
  • Controlla i messaggi relativi all'autenticazione nella scheda Registri dell'interfaccia utente dell'emulatore.

Scegli un progetto Firebase

Firebase Local Emulator Suite emula i prodotti per un singolo progetto Firebase.

Per selezionare il progetto da utilizzare, prima di avviare gli emulatori, nella CLI eseguire firebase use nella propria directory di lavoro. Oppure puoi passare il flag --project a ciascun comando dell'emulatore.

Local Emulator Suite supporta l'emulazione di progetti Firebase reali e progetti demo .

Tipo di progetto Caratteristiche Utilizzare con emulatori
Vero

Un vero progetto Firebase è quello che hai creato e configurato (molto probabilmente tramite la console Firebase).

I progetti reali hanno risorse live, come istanze di database, bucket di archiviazione, funzioni o qualsiasi altra risorsa configurata per quel progetto Firebase.

Quando lavori con progetti Firebase reali, puoi eseguire emulatori per uno o tutti i prodotti supportati.

Per tutti i prodotti che non stai emulando, le tue app e il tuo codice interagiranno con la risorsa live (istanza di database, bucket di archiviazione, funzione e così via).

Demo

Un progetto Firebase demo non ha una configurazione Firebase reale e nessuna risorsa attiva. Di solito si accede a questi progetti tramite codelab o altri tutorial.

Gli ID progetto per i progetti demo hanno il prefisso demo- .

Quando lavori con progetti dimostrativi Firebase, le tue app e il tuo codice interagiscono solo con gli emulatori . Se la tua app tenta di interagire con una risorsa per la quale non è in esecuzione un emulatore, tale codice avrà esito negativo.

Ti consigliamo di utilizzare progetti demo ove possibile. I vantaggi includono:

  • Configurazione più semplice, poiché puoi eseguire gli emulatori senza mai creare un progetto Firebase
  • Maggiore sicurezza, poiché se il tuo codice richiama accidentalmente risorse (di produzione) non emulate, non vi è alcuna possibilità di modifica, utilizzo e fatturazione dei dati
  • Migliore supporto offline, poiché non è necessario accedere a Internet per scaricare la configurazione dell'SDK.

Strumenta la tua app per parlare con l'emulatore

SDK per Android, iOS e web

Imposta la configurazione in-app o le classi di test per interagire con l'emulatore di autenticazione come segue.

Kotlin+KTX
Firebase.auth.useEmulator("10.0.2.2", 9099)
Java
FirebaseAuth.getInstance().useEmulator("10.0.2.2", 9099);
Rapido
Auth.auth().useEmulator(withHost:"localhost", port:9099)

Web modular API

import { getAuth, connectAuthEmulator } from "firebase/auth";

const auth = getAuth();
connectAuthEmulator(auth, "http://localhost:9099");

Web namespaced API

const auth = firebase.auth();
auth.useEmulator("http://localhost:9099");

Non è necessaria alcuna configurazione aggiuntiva per prototipare e testare le interazioni tra l'autenticazione e le funzioni cloud o le regole di sicurezza Firebase per Cloud Firestore o Realtime Database. Quando l'emulatore di autenticazione è configurato e altri emulatori sono in esecuzione, funzionano automaticamente insieme.

SDK di amministrazione

Gli SDK Firebase Admin si connettono automaticamente all'emulatore di autenticazione quando è impostata la variabile di ambiente FIREBASE_AUTH_EMULATOR_HOST .

export FIREBASE_AUTH_EMULATOR_HOST="localhost:9099"

Tieni presente che l'emulatore di Cloud Functions riconosce automaticamente l'emulatore di autenticazione, quindi puoi saltare questo passaggio durante il test delle integrazioni tra Cloud Functions e gli emulatori di autenticazione. La variabile di ambiente verrà impostata automaticamente per Admin SDK in Cloud Functions.

Con la variabile di ambiente impostata, gli SDK Firebase Admin accetteranno token ID non firmati e cookie di sessione emessi dall'emulatore di autenticazione (rispettivamente tramite i metodi verifyIdToken e createSessionCookie ) per facilitare lo sviluppo e il test locali. Assicurati di non impostare la variabile di ambiente in produzione.

Se desideri che il tuo codice Admin SDK si connetta a un emulatore condiviso in esecuzione in un altro ambiente, dovrai specificare lo stesso ID progetto che hai impostato utilizzando l'interfaccia a riga di comando di Firebase . Puoi passare direttamente un ID progetto a initializeApp o impostare la variabile di ambiente GCLOUD_PROJECT .

SDK di amministrazione di Node.js
admin.initializeApp({ projectId: "your-project-id" });
Variabile d'ambiente
export GCLOUD_PROJECT="your-project-id"

Token ID

Per motivi di sicurezza, l'emulatore di autenticazione emette token ID non firmati , che vengono accettati solo da altri emulatori Firebase o dall'SDK Firebase Admin se configurato . Questi token verranno rifiutati dai servizi Firebase di produzione o dall'SDK Firebase Admin in esecuzione in modalità di produzione (ad es. il comportamento predefinito senza i passaggi di configurazione descritti sopra).

Avvia l'emulatore

È possibile utilizzare l'emulatore di autenticazione in modo interattivo tramite l'interfaccia utente di Emulator Suite e in modo non interattivo tramite l'interfaccia REST locale. Le sezioni seguenti trattano casi d'uso interattivi e non interattivi.

Per avviare l'emulatore di autenticazione, la relativa interfaccia REST e l'interfaccia utente di Emulator Suite, eseguire:

firebase emulators:start

Per l'autenticazione anonima , la tua app può esercitare la logica di accesso per la tua piattaforma ( iOS , Android , Web ).

Per l'autenticazione email/password , puoi avviare la creazione di prototipi aggiungendo account utente all'emulatore di autenticazione dalla tua app utilizzando i metodi dell'SDK di autenticazione o utilizzando l'interfaccia utente di Emulator Suite.

  1. Nell'interfaccia utente di Emulator Suite, fai clic sulla scheda Autenticazione .
  2. Fare clic sul pulsante Aggiungi utente .
  3. Segui la procedura guidata per la creazione dell'account utente, compilando i campi di autenticazione e-mail.

Con un utente di test creato, la tua app può far accedere e disconnettere l'utente con la logica SDK per la tua piattaforma ( iOS , Android , Web ).

Per testare la verifica dell'e-mail/l'accesso con flussi di collegamenti e-mail, l'emulatore stampa un URL sul terminale in cui è stato eseguito firebase emulators:start .

i  To verify the email address customer@ex.com, follow this link:
http://localhost:9099/emulator/action?mode=verifyEmail&lang=en&oobCode=XYZ123&apiKey=fake-api-key

Incolla il collegamento nel browser per simulare l'evento di verifica e controlla se la verifica è riuscita.

{
  "authEmulator": {
    "success": "The email has been successfully verified.",
    "email": "customer@example.com"
  }
}

Per testare la reimpostazione della password, l'emulatore stampa un URL simile, incluso un parametro newPassword (che puoi modificare secondo necessità), sul terminale.

http://localhost:9099/emulator/action?mode=resetPassword&oobCode=XYZ!23&apiKey=fake-api-key&newPassword=YOUR_NEW_PASSWORD

Test non interattivo

Invece di utilizzare l'interfaccia utente di Emulator Suite o il codice client per gestire gli account utente e-mail/password, puoi scrivere script di configurazione del test che chiamano le API REST per creare ed eliminare account utente e recuperare codici di verifica e-mail fuori banda per popolare la verifica e-mail dell'emulatore URL. Ciò mantiene la piattaforma e il codice di test separati e ti consente di testare in modo non interattivo.

Per i flussi di test di posta elettronica e password non interattivi, la sequenza tipica è la seguente.

  1. Creare utenti con l' endpoint REST di iscrizione all'autenticazione.
  2. Accedi agli utenti utilizzando le e-mail e le password per eseguire i test.
  3. Se applicabile ai tuoi test, recupera i codici di verifica e-mail fuori banda disponibili dall'endpont REST specifico dell'emulatore .
  4. Svuota i record utente con l' endpoint REST specifico dell'emulatore per cancellare i dati.

Autenticazione tramite telefono/SMS emulato

Per l'autenticazione telefonica, l'emulatore Auth non supporta:

  • flussi reCAPTCHA e APN. Una volta configurati per interagire con l'emulatore, gli SDK client disabilitano questi metodi di verifica in modo simile a quello descritto per i test di integrazione ( iOS , Android , web ).
  • Prova i numeri di telefono con i codici preconfigurati nella console Firebase.

Altrimenti, in termini di codice client, il flusso di autenticazione telefono/SMS è identico a quello descritto per la produzione ( iOS , Android , web ).

Utilizzo dell'interfaccia utente di Emulator Suite:

  1. Nell'interfaccia utente di Emulator Suite, fai clic sulla scheda Autenticazione .
  2. Fare clic sul pulsante Aggiungi utente .
  3. Segui la procedura guidata per la creazione dell'account utente, compilando i campi di autenticazione telefonica.

Tuttavia, per i flussi di autenticazione telefonica, l'emulatore NON attiverà la consegna di alcun messaggio di testo, poiché il contatto con un operatore telefonico non rientra nell'ambito e non è adatto per i test locali! Invece, l'emulatore stampa il codice che sarebbe stato inviato via SMS allo stesso terminale su cui hai eseguito firebase emulators:start ; inserisci questo codice nell'app per simulare gli utenti che controllano i loro messaggi di testo.

Test non interattivo

Per il test dell'autenticazione del telefono non interattivo, utilizzare l'API REST dell'emulatore di autenticazione per recuperare i codici SMS disponibili. Tieni presente che il codice è diverso ogni volta che avvii il flusso.

La sequenza tipica è la seguente.

  1. Chiama la piattaforma signInWithPhoneNumber per avviare il processo di verifica.
  2. Recupera il codice di verifica utilizzando l' endpoint REST specifico dell'emulatore .
  3. Chiamare confirmationResult.confirm(code) come al solito con il codice di verifica.

SMS a più fattori

L'emulatore di autenticazione supporta la creazione di prototipi e il test dei flussi di autenticazione a più fattori (MFA) SMS disponibili in produzione per iOS , Android e Web .

Quando aggiungi un utente fittizio all'emulatore, puoi abilitare MFA e configurare uno o più numeri di telefono a cui verranno inviati i messaggi SMS di secondo fattore. I messaggi vengono inviati allo stesso terminale in cui hai eseguito firebase emulators:start e sono disponibili dall'interfaccia REST.

Autenticazione del provider di identità di terze parti (IDP) emulata

L'emulatore di autenticazione ti consente di testare molti flussi di autenticazione di terze parti nelle tue app iOS, Android o Web senza modifiche rispetto al codice di produzione. Per esempi di flussi di autenticazione, consulta la documentazione relativa alle varie combinazioni di provider e piattaforme che puoi utilizzare nella tua app .

In generale, puoi utilizzare l'SDK Firebase per eseguire l'autenticazione in due modi:

  • La tua app consente all'SDK di gestire l'intero processo end-to-end, incluse tutte le interazioni con provider IDP di terze parti per recuperare le credenziali.
  • La tua app recupera manualmente le credenziali da un provider di terze parti utilizzando l'SDK di quella parte e passa tali credenziali all'SDK di autenticazione.

Ancora una volta, controlla il link alla documentazione sopra e assicurati di avere familiarità con il flusso (gestito dall'SDK Firebase o recupero manuale delle credenziali) che desideri utilizzare. L'emulatore di autenticazione supporta il test di entrambi gli approcci.

Test dei flussi IDP guidati dall'SDK di Firebase

Se la tua app utilizza un flusso end-to-end dell'SDK Firebase, come OAuthProvider per l'accesso con Microsoft, GitHub o Yahoo, per i test interattivi, l'emulatore di autenticazione fornisce una versione locale della pagina di accesso corrispondente per aiutarti a testare autenticazione da app Web che chiamano il metodo signinWithPopup o signInWithRedirect . Questa pagina di accesso servita localmente viene visualizzata anche nelle app per dispositivi mobili, resa dalla libreria WebView della tua piattaforma.

L'emulatore crea finti account utente e credenziali di terze parti secondo necessità man mano che i flussi procedono.

Test dei flussi IDP con recupero manuale delle credenziali

Se usi tecniche di accesso "manuali" e chiami il metodo signInWithCredentials della tua piattaforma, allora, come al solito, la tua app richiederà l'accesso reale di terze parti e recupererà le credenziali reali di terze parti.

Tieni presente che l'emulatore supporta solo l'autenticazione signInWithCredential per le credenziali recuperate da Google Sign-In, Apple e altri provider che utilizzano token ID implementati come token Web JSON (JWT). I token di accesso (ad esempio quelli forniti da Facebook o Twitter, che non sono JWT) non sono supportati. La sezione successiva discute un'alternativa in questi casi.

Test non interattivo

Un approccio ai test non interattivi consiste nell'automatizzare i clic degli utenti sulla pagina di accesso fornita dall'emulatore. Per le app Web, usa un'interfaccia di controllo come WebDriver. Per i dispositivi mobili, utilizza gli strumenti di test dell'interfaccia utente dalla tua piattaforma, come Espresso o Xcode.

In alternativa, puoi aggiornare il tuo codice per utilizzare signInWithCredential (ad esempio in un ramo di codice) e utilizzare un flusso di autenticazione token con token ID fittizi per gli account invece di credenziali reali.

  1. Ricablare o commentare la parte del codice che recupera gli idToken dall'IDP; questo elimina la necessità di inserire nomi utente e password reali durante i test e solleva i test dalle quote API e dai limiti di velocità presso l'IDP.
  2. In secondo luogo, utilizzare una stringa JSON letterale al posto del token per signInWithCredential . Utilizzando l'SDK Web come esempio, puoi modificare il codice in:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

Se utilizzato con l'emulatore, questo codice autenticherà correttamente un utente con l'email foo@example.com su Google. Pensa al campo secondario come a una chiave primaria, che può essere modificata in qualsiasi stringa, simulando l'accesso di diversi utenti. Puoi sostituire firebase.auth.GoogleAuthProvider con, ad esempio, new firebase.auth.OAuthProvider('yahoo.com') o qualsiasi altro ID provider che desideri simulare.

Autenticazione del token personalizzato emulato

L'emulatore di autenticazione gestisce l'autenticazione con i token Web JSON personalizzati utilizzando le chiamate al metodo signInWithCustomToken sulle piattaforme supportate, come descritto nella documentazione relativa all'autenticazione di produzione .

In che modo l'emulatore di autenticazione differisce dalla produzione

L'emulatore Firebase Authentication simula molte funzionalità del prodotto di produzione. Tuttavia, poiché qualsiasi tipo di sistema di autenticazione si basa fortemente sulla sicurezza a più livelli (dispositivo, provider di terze parti, Firebase, ecc.), è difficile per l'emulatore ricreare correttamente tutti i flussi.

Cloud IAM

Firebase Emulator Suite non tenta di replicare o rispettare alcun comportamento correlato a IAM per l'esecuzione. Gli emulatori aderiscono alle regole di sicurezza Firebase fornite, ma in situazioni in cui IAM verrebbe normalmente utilizzato, ad esempio per impostare Cloud Functions richiamando l'account di servizio e quindi le autorizzazioni, l'emulatore non è configurabile e utilizzerà l'account disponibile a livello globale sulla macchina dello sviluppatore, simile all'esecuzione diretta di uno script locale.

Poiché sulle piattaforme mobili, l'accesso al collegamento e-mail si basa sui collegamenti dinamici Firebase, tutti questi collegamenti verranno invece aperti sulla piattaforma Web (mobile).

Accesso di terze parti

Per i flussi di accesso di terze parti, Firebase Authentication si basa su credenziali sicure di provider di terze parti come Twitter e Github.

Le credenziali reali dei provider OpenID Connect come Google e Apple sono accettate dall'emulatore di autenticazione. Le credenziali di provider non OpenID Connect non sono supportate.

Accesso tramite e-mail/SMS

Nelle app di produzione, i flussi di accesso tramite posta elettronica e SMS implicano un'operazione asincrona in cui l'utente controlla un messaggio ricevuto e immette un codice di accesso in un'interfaccia di accesso. L'emulatore di autenticazione non invia e-mail o messaggi SMS, ma, come descritto sopra , genera codici di accesso e li invia al terminale per essere utilizzati nei test.

L'emulatore non supporta la possibilità di definire numeri di telefono di prova con codici di accesso fissi come si può fare utilizzando la console Firebase.

Autenticazione token personalizzata

L'emulatore di autenticazione non convalida la firma o la scadenza dei token personalizzati. Ciò consente di utilizzare token realizzati a mano e riutilizzarli a tempo indeterminato in scenari di prototipazione e test.

Tasso di limitazione / anti-abuso

L'emulatore di autenticazione non replica le funzioni di limitazione della velocità di produzione o anti-abuso.

Funzioni di blocco

In produzione, gli utenti vengono scritti nell'archiviazione una volta dopo l'attivazione degli eventi beforeCreate e beforeSignIn . Tuttavia, a causa di limitazioni tecniche, l'emulatore di autenticazione scrive nell'archivio due volte, una dopo la creazione dell'utente e un'altra dopo l'accesso. Ciò significa che per i nuovi utenti è possibile chiamare correttamente getAuth().getUser() in beforeSignIn nell'emulatore di autenticazione, ma si verificherebbe un errore durante l'operazione in produzione.

E dopo?