Connetti 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 ed esaminare i relativi 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 relativa alla 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 nella produzione Firebase Authentication . Abbinato alle piattaforme Apple, agli SDK Android e Web Firebase, l'emulatore ti consente di:

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

Scegli un progetto Firebase

La 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 directory di lavoro. In alternativa, 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 attive, 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 del database, bucket di archiviazione, funzione e così via).

Dimostrazione

Un progetto Firebase demo non ha una configurazione Firebase reale né risorse live. 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 Firebase demo, 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, il 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 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.

Strumenti la tua app per comunicare con l'emulatore

SDK per Android, iOS e Web

Imposta la configurazione in-app o le classi di prova 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);
Veloce
Auth.auth().useEmulator(withHost:"127.0.0.1", port:9099)

Web modular API

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

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

Web namespaced API

const auth = firebase.auth();
auth.useEmulator("http://127.0.0.1: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 di Firebase Admin si connettono automaticamente all'emulatore di autenticazione quando è impostata la variabile di ambiente FIREBASE_AUTH_EMULATOR_HOST .

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

Tieni presente che l'emulatore Cloud Functions riconosce automaticamente l'emulatore di autenticazione, quindi puoi saltare questo passaggio quando testi le 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 di amministrazione di Firebase 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 i test locali. Assicurati di non impostare la variabile d'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 la CLI Firebase . Puoi passare un ID progetto per inizializzare direttamente initializeApp o impostare la variabile di ambiente GCLOUD_PROJECT .

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

Gettoni identificativi

Per motivi di sicurezza, l'emulatore di autenticazione emette token ID non firmati , che sono accettati solo da altri emulatori Firebase o da Firebase Admin SDK quando configurato . Questi token verranno rifiutati dai servizi Firebase di produzione o dall'SDK Firebase Admin in esecuzione in modalità di produzione (ad esempio 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 riguardano casi d'uso interattivi e non interattivi.

Per avviare l'emulatore di autenticazione, la sua 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 tramite posta elettronica/password , puoi iniziare la prototipazione aggiungendo account utente all'emulatore di autenticazione dalla tua app utilizzando i metodi 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 di creazione dell'account utente, compilando i campi di autenticazione email.

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

Per testare la verifica/l'accesso tramite posta elettronica con i flussi di collegamento tramite posta elettronica, l'emulatore stampa un URL sul terminale su cui è stato eseguito firebase emulators:start .

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

Incolla il collegamento nel tuo 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://127.0.0.1:9099/emulator/action?mode=resetPassword&oobCode=XYZ!23&apiKey=fake-api-key&newPassword=YOUR_NEW_PASSWORD

Test non interattivi

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 di 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 consente di eseguire test in modo non interattivo.

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

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

Autenticazione telefonica/SMS emulata

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 ).
  • Testa i numeri di telefono con i codici preconfigurati nella console Firebase.

Diversamente, a livello di codice cliente, il flusso di autenticazione telefono/SMS è identico a quello descritto per la produzione ( iOS , Android , web ).

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 di creazione dell'account utente, compilando i campi di autenticazione del telefono.

Tuttavia, per i flussi di autenticazione telefonica, l'emulatore NON attiverà la consegna di alcun messaggio di testo, poiché contattare un operatore telefonico è fuori ambito e non è amichevole 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 interattivi

Per i test di autenticazione telefonica non interattiva, 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. Chiama confirmationResult.confirm(code) come al solito con il codice di verifica.

SMS multifattore

L'emulatore di autenticazione supporta la prototipazione 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 su cui hai eseguito firebase emulators:start e sono disponibili dall'interfaccia REST.

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

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 i 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 trasmette tali credenziali all'SDK di autenticazione.

Anche in questo caso, controlla il collegamento alla documentazione riportato sopra e assicurati di avere familiarità con il flusso che desideri utilizzare, ovvero il recupero delle credenziali gestito dall'SDK di Firebase o quello manuale. L'emulatore di autenticazione supporta il test di entrambi gli approcci.

Test dei flussi IDP basati sull'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 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 mobili, resa dalla libreria di visualizzazione web della tua piattaforma.

L'emulatore crea account utente e credenziali fittizi di terze parti in base alle necessità man mano che i flussi procedono.

Testare i flussi IDP con il recupero manuale delle credenziali

Se utilizzi tecniche di accesso "manuale" e chiami il metodo signInWithCredentials della tua piattaforma, come al solito la tua app richiederà un accesso reale di terze parti e recupererà 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 JSON Web Token (JWT). I token di accesso (ad esempio quelli forniti da Facebook o Twitter, che non sono JWT) non sono supportati. La sezione successiva illustra un'alternativa in questi casi.

Test non interattivi

Un approccio ai test non interattivi consiste nell'automatizzare i clic degli utenti sulla pagina di accesso fornita dall'emulatore. Per le app Web, utilizzare 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 tramite token con token ID fittizi per gli account anziché credenziali reali.

  1. Ricabla o commenta la parte del tuo codice che recupera gli idToken dall'IDP; ciò 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, utilizza 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'e-mail foo@example.com su Google. Pensa al campo secondario come a una chiave primaria, che può essere modificata in qualsiasi stringa, simulando la firma di utenti diversi. Puoi sostituire firebase.auth.GoogleAuthProvider con, ad esempio, new firebase.auth.OAuthProvider('yahoo.com') o qualsiasi altro ID provider che desideri simulare.

Autenticazione token personalizzata emulata

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

Differenze tra l'emulatore di autenticazione e la produzione

L'emulatore di autenticazione Firebase simula molte funzionalità del prodotto di produzione. Tuttavia, poiché qualsiasi tipo di sistema di autenticazione fa molto affidamento 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 durante l'esecuzione. Gli emulatori aderiscono alle regole di sicurezza Firebase fornite, ma nelle situazioni in cui verrebbe normalmente utilizzato IAM, ad esempio per impostare Cloud Functions che richiamano l'account del servizio e quindi le autorizzazioni, l'emulatore non è configurabile e utilizzerà l'account disponibile a livello globale sul computer dello sviluppatore, simile all'esecuzione diretta di uno script locale.

Poiché sulle piattaforme mobili, l'accesso tramite collegamento e-mail si basa su Firebase Dynamic Links, 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 comportano 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 è possibile fare utilizzando la console Firebase.

Autenticazione tramite token personalizzato

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

Limitazione della tariffa/antiabuso

L'emulatore di autenticazione non replica le funzionalità di limitazione della velocità di produzione o antiabuso.

Funzioni di blocco

In produzione, gli utenti vengono scritti nell'archivio 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 questa operazione in produzione.

E dopo?