Verbinden Sie Ihre App mit dem Authentifizierungsemulator

Bevor Sie den Authentifizierungsemulator mit Ihrer App verwenden, stellen Sie sicher, dass Sie den gesamten Firebase Local Emulator Suite-Workflow verstehen , dass Sie die Local Emulator Suite installieren und konfigurieren und ihre CLI-Befehle überprüfen.

In diesem Thema wird davon ausgegangen, dass Sie bereits mit der Entwicklung von Firebase-Authentifizierungslösungen für die Produktion vertraut sind. Lesen Sie bei Bedarf die Dokumentation für Ihre Kombination aus Plattform und Authentifizierungstechnik .

Was kann ich mit dem Authentifizierungsemulator tun?

Der Authentifizierungsemulator bietet eine hochpräzise lokale Emulation von Firebase-Authentifizierungsdiensten und stellt einen Großteil der Funktionalität bereit, die in der Firebase-Authentifizierung für die Produktion zu finden ist. In Verbindung mit den Apple-Plattformen Android und Web Firebase SDKs ermöglicht Ihnen der Emulator:

  • Erstellen, aktualisieren und verwalten Sie emulierte Benutzerkonten zum Testen der Authentifizierung von E-Mail/Passwort, Telefonnummer/SMS, SMS-Multifaktor und Identitätsanbietern von Drittanbietern (z. B. Google).
  • Emulierte Benutzer anzeigen und bearbeiten
  • Prototypen benutzerdefinierter Token-Authentifizierungssysteme
  • Überprüfen Sie die authentifizierungsbezogenen Meldungen auf der Registerkarte „Emulator-UI-Protokolle“.

Wählen Sie ein Firebase-Projekt

Die Firebase Local Emulator Suite emuliert Produkte für ein einzelnes Firebase-Projekt.

Um das zu verwendende Projekt auszuwählen, führen Sie vor dem Starten der Emulatoren in der CLI firebase use in Ihrem Arbeitsverzeichnis aus. Alternativ können Sie das Flag --project an jeden Emulatorbefehl übergeben.

Die Local Emulator Suite unterstützt die Emulation echter Firebase-Projekte und Demoprojekte .

Projekttyp Merkmale Verwendung mit Emulatoren
Real

Ein echtes Firebase-Projekt ist eines, das Sie erstellt und konfiguriert haben (höchstwahrscheinlich über die Firebase-Konsole).

Echte Projekte verfügen über Live-Ressourcen wie Datenbankinstanzen, Speicher-Buckets, Funktionen oder jede andere Ressource, die Sie für dieses Firebase-Projekt einrichten.

Wenn Sie mit echten Firebase-Projekten arbeiten, können Sie Emulatoren für einige oder alle unterstützten Produkte ausführen.

Bei allen Produkten, die Sie nicht emulieren, interagieren Ihre Apps und Ihr Code mit der Live- Ressource (Datenbankinstanz, Speicher-Bucket, Funktion usw.).

Demo

Ein Demo-Firebase-Projekt hat keine echte Firebase-Konfiguration und keine Live-Ressourcen. Der Zugriff auf diese Projekte erfolgt normalerweise über Codelabs oder andere Tutorials.

Projekt-IDs für Demoprojekte haben das Präfix demo- .

Wenn Sie mit Firebase-Demoprojekten arbeiten, interagieren Ihre Apps und Ihr Code nur mit Emulatoren. Wenn Ihre App versucht, mit einer Ressource zu interagieren, für die kein Emulator ausgeführt wird, schlägt dieser Code fehl.

Wir empfehlen Ihnen, nach Möglichkeit Demoprojekte zu verwenden. Zu den Vorteilen gehören:

  • Einfachere Einrichtung, da Sie die Emulatoren ausführen können, ohne jemals ein Firebase-Projekt zu erstellen
  • Höhere Sicherheit, denn wenn Ihr Code versehentlich nicht emulierte (Produktions-)Ressourcen aufruft, besteht keine Chance auf Datenänderung, Nutzung und Abrechnung
  • Bessere Offline-Unterstützung, da zum Herunterladen Ihrer SDK-Konfiguration kein Zugriff auf das Internet erforderlich ist.

Instrumentieren Sie Ihre App, um mit dem Emulator zu kommunizieren

Android-, iOS- und Web-SDKs

Richten Sie Ihre In-App-Konfiguration oder Testklassen wie folgt für die Interaktion mit dem Authentifizierungsemulator ein.

Kotlin+KTX
Firebase.auth.useEmulator("10.0.2.2", 9099)
Java
FirebaseAuth.getInstance().useEmulator("10.0.2.2", 9099);
Schnell
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");

Es ist keine zusätzliche Einrichtung erforderlich, um Interaktionen zwischen Authentifizierung und Cloud-Funktionen oder Firebase-Sicherheitsregeln für Cloud Firestore oder Realtime Database zu prototypisieren und zu testen. Wenn der Authentifizierungsemulator konfiguriert ist und andere Emulatoren ausgeführt werden, arbeiten diese automatisch zusammen.

Admin-SDKs

Die Firebase Admin SDKs stellen automatisch eine Verbindung zum Authentifizierungsemulator her, wenn die Umgebungsvariable FIREBASE_AUTH_EMULATOR_HOST festgelegt ist.

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

Beachten Sie, dass der Cloud Functions-Emulator den Authentifizierungsemulator automatisch erkennt, sodass Sie diesen Schritt überspringen können, wenn Sie Integrationen zwischen Cloud Functions und Authentifizierungsemulatoren testen. Die Umgebungsvariable wird automatisch für das Admin SDK in Cloud Functions festgelegt.

Wenn die Umgebungsvariable festgelegt ist, akzeptieren Firebase Admin SDKs nicht signierte ID-Tokens und vom Authentifizierungsemulator ausgegebene Sitzungscookies (über die Methoden verifyIdToken bzw. createSessionCookie ), um die lokale Entwicklung und das Testen zu erleichtern. Bitte achten Sie darauf, die Umgebungsvariable nicht in der Produktion festzulegen.

Wenn Sie möchten, dass Ihr Admin-SDK-Code eine Verbindung zu einem gemeinsam genutzten Emulator herstellt, der in einer anderen Umgebung ausgeführt wird, müssen Sie dieselbe Projekt-ID angeben, die Sie mit der Firebase-CLI festgelegt haben . Sie können eine Projekt-ID direkt an initializeApp übergeben oder die Umgebungsvariable GCLOUD_PROJECT festlegen.

Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
Umgebungsvariable
export GCLOUD_PROJECT="your-project-id"

ID-Token

Aus Sicherheitsgründen stellt der Authentifizierungsemulator nicht signierte ID-Tokens aus, die nur von anderen Firebase-Emulatoren oder dem Firebase Admin SDK akzeptiert werden, wenn diese konfiguriert sind . Diese Token werden von Firebase-Produktionsdiensten oder dem Firebase Admin SDK, das im Produktionsmodus ausgeführt wird, abgelehnt (z. B. das Standardverhalten ohne die oben beschriebenen Einrichtungsschritte).

Starten Sie den Emulator

Sie können den Authentifizierungsemulator interaktiv über die Benutzeroberfläche der Emulator Suite und nicht interaktiv über seine lokale REST-Schnittstelle verwenden. In den folgenden Abschnitten werden interaktive und nicht interaktive Anwendungsfälle behandelt.

Führen Sie Folgendes aus, um den Authentifizierungsemulator, seine REST-Schnittstelle und die Benutzeroberfläche der Emulator Suite zu starten:

firebase emulators:start

Für die anonyme Authentifizierung kann Ihre App die Anmeldelogik für Ihre Plattform ( iOS , Android , Web ) anwenden.

Für die E-Mail-/Passwort-Authentifizierung können Sie mit dem Prototyping beginnen, indem Sie Benutzerkonten zum Authentifizierungsemulator aus Ihrer App hinzufügen, indem Sie die Authentifizierungs-SDK-Methoden verwenden oder die Benutzeroberfläche der Emulator Suite verwenden.

  1. Klicken Sie in der Emulator Suite-Benutzeroberfläche auf die Registerkarte Authentifizierung .
  2. Klicken Sie auf die Schaltfläche Benutzer hinzufügen .
  3. Folgen Sie dem Assistenten zum Erstellen eines Benutzerkontos und füllen Sie die E-Mail-Authentifizierungsfelder aus.

Wenn ein Testbenutzer erstellt wurde, kann Ihre App den Benutzer mit der SDK-Logik für Ihre Plattform ( iOS , Android , Web ) an- und abmelden.

Zum Testen der E-Mail-Verifizierung/Anmeldung mit E-Mail-Link-Flows gibt der Emulator eine URL an das Terminal aus, an dem firebase emulators:start ausgeführt wurde.

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

Fügen Sie den Link in Ihren Browser ein, um das Verifizierungsereignis zu simulieren und zu prüfen, ob die Verifizierung erfolgreich war.

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

Zum Testen des Zurücksetzens von Passwörtern gibt der Emulator eine ähnliche URL, einschließlich eines newPassword- Parameters (den Sie bei Bedarf ändern können), an das Terminal aus.

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

Nicht interaktives Testen

Anstatt die Emulator Suite-Benutzeroberfläche oder den Clientcode zum Verwalten von E-Mail-/Passwort-Benutzerkonten zu verwenden, können Sie Test-Setup-Skripte schreiben, die REST-APIs aufrufen, um Benutzerkonten zu erstellen und zu löschen und Out-of-Band-E-Mail-Verifizierungscodes abzurufen, um die E-Mail-Verifizierung des Emulators zu füllen URL. Dadurch bleibt Plattform und Testcode getrennt und Sie können nicht interaktiv testen.

Für nicht interaktive E-Mail- und Passwort-Testabläufe ist die typische Reihenfolge wie folgt.

  1. Erstellen Sie Benutzer mit dem Authentication signUp REST-Endpunkt .
  2. Melden Sie Benutzer mit den E-Mail-Adressen und Passwörtern an, um Tests durchzuführen.
  3. Rufen Sie, sofern für Ihre Tests zutreffend, verfügbare Out-of-Band-E-Mail-Verifizierungscodes vom emulatorspezifischen REST-Endpunkt ab.
  4. Leeren Sie Benutzerdatensätze mit dem emulatorspezifischen REST-Endpunkt, um Daten zu löschen.

Emulierte Telefon-/SMS-Authentifizierung

Für die Telefonauthentifizierung unterstützt der Auth-Emulator Folgendes nicht:

  • reCAPTCHA- und APN-Flows. Sobald Client-SDKs für die Interaktion mit dem Emulator konfiguriert sind, deaktivieren sie diese Überprüfungsmethoden auf ähnliche Weise wie für Integrationstests ( iOS , Android , Web ) beschrieben.
  • Testen Sie Telefonnummern mit in der Firebase-Konsole vorkonfigurierten Codes.

Ansonsten ist der Telefon-/SMS-Authentifizierungsablauf in Bezug auf den Client-Code identisch mit dem für die Produktion beschriebenen ( iOS , Android , Web ).

Verwenden der Benutzeroberfläche der Emulator Suite:

  1. Klicken Sie in der Emulator Suite-Benutzeroberfläche auf die Registerkarte Authentifizierung .
  2. Klicken Sie auf die Schaltfläche Benutzer hinzufügen .
  3. Folgen Sie dem Assistenten zum Erstellen eines Benutzerkontos und füllen Sie die Felder zur Telefonauthentifizierung aus.

Bei Telefonauthentifizierungsabläufen löst der Emulator jedoch KEINE Zustellung von Textnachrichten aus, da die Kontaktaufnahme mit einem Netzbetreiber außerhalb des Anwendungsbereichs liegt und für lokale Tests nicht geeignet ist! Stattdessen gibt der Emulator den Code aus, der per SMS an dasselbe Terminal gesendet worden wäre, an dem Sie firebase emulators:start ausgeführt haben; Geben Sie diesen Code in die App ein, um zu simulieren, dass Benutzer ihre Textnachrichten lesen.

Nicht interaktives Testen

Für nicht interaktive Telefonauthentifizierungstests verwenden Sie die REST-API des Authentifizierungsemulators, um verfügbare SMS-Codes abzurufen. Beachten Sie, dass der Code jedes Mal anders ist, wenn Sie den Flow starten.

Der typische Ablauf ist wie folgt.

  1. Rufen Sie die Plattform signInWithPhoneNumber auf, um den Verifizierungsprozess zu starten.
  2. Rufen Sie den Bestätigungscode mithilfe des emulatorspezifischen REST-Endpunkts ab.
  3. Rufen Sie mit dem Verifizierungscode wie gewohnt confirmationResult.confirm(code) auf.

Multifaktor-SMS

Der Authentifizierungsemulator unterstützt das Prototyping und Testen der SMS-Multi-Faktor-Authentifizierungsflüsse (MFA), die in der Produktion für iOS , Android und Web verfügbar sind.

Wenn Sie dem Emulator einen Scheinbenutzer hinzufügen, können Sie MFA aktivieren und eine oder mehrere Telefonnummern konfigurieren, an die SMS-Nachrichten des zweiten Faktors gesendet werden. Nachrichten werden an dasselbe Terminal ausgegeben, an dem Sie firebase emulators:start ausgeführt haben, und sind über die REST-Schnittstelle verfügbar.

Emulierte Drittanbieter-IDP-Authentifizierung (Drittanbieter-Identitätsanbieter).

Mit dem Authentifizierungsemulator können Sie viele Authentifizierungsabläufe von Drittanbietern in Ihren iOS-, Android- oder Web-Apps testen, ohne Änderungen am Produktionscode vorzunehmen. Beispiele für Authentifizierungsabläufe finden Sie in der Dokumentation zu verschiedenen Kombinationen von Anbietern und Plattformen, die Sie in Ihrer App verwenden können .

Im Allgemeinen können Sie das Firebase SDK auf zwei Arten zur Authentifizierung verwenden:

  • Ihre App lässt das SDK den gesamten Prozess durchgängig abwickeln, einschließlich aller Interaktionen mit externen IDP-Anbietern zum Abrufen von Anmeldeinformationen.
  • Ihre App ruft mithilfe des SDK dieses Anbieters manuell Anmeldeinformationen von einem Drittanbieter ab und gibt diese Anmeldeinformationen an das Authentifizierungs-SDK weiter.

Sehen Sie sich noch einmal den Dokumentationslink oben an und stellen Sie sicher, dass Sie mit dem Ablauf vertraut sind – vom Firebase SDK verwalteter oder manueller Abruf von Anmeldeinformationen –, den Sie verwenden möchten. Der Authentifizierungsemulator unterstützt das Testen beider Ansätze.

Testen von Firebase SDK-gesteuerten IDP-Flows

Wenn Ihre App für interaktive Tests einen Firebase SDK-End-to-End-Flow wie OAuthProvider für die Anmeldung bei Microsoft, GitHub oder Yahoo verwendet, stellt der Authentifizierungsemulator eine lokale Version der entsprechenden Anmeldeseite bereit, um Sie beim Testen zu unterstützen Authentifizierung von Web-Apps, die die Methode signinWithPopup oder signInWithRedirect aufrufen. Diese lokal bereitgestellte Anmeldeseite wird auch in mobilen Apps angezeigt und von der Webview-Bibliothek Ihrer Plattform gerendert.

Der Emulator erstellt nach Bedarf Scheinkonten und Anmeldeinformationen von Drittanbietern, während die Abläufe fortschreiten.

Testen von IDP-Flows mit manuellem Abruf von Anmeldeinformationen

Wenn Sie „manuelle“ Anmeldetechniken verwenden und die signInWithCredentials Methode Ihrer Plattform aufrufen, fordert Ihre App wie üblich eine echte Anmeldung eines Drittanbieters an und ruft echte Anmeldeinformationen eines Drittanbieters ab.

Beachten Sie, dass der Emulator die signInWithCredential Authentifizierung nur für Anmeldeinformationen unterstützt, die von Google Sign-In, Apple und anderen Anbietern abgerufen werden, die ID-Token verwenden, die als JSON Web Tokens (JWTs) implementiert sind. Zugriffstoken (z. B. die von Facebook oder Twitter bereitgestellten, die keine JWTs sind) werden nicht unterstützt. Im nächsten Abschnitt wird eine Alternative für diese Fälle erörtert.

Nicht interaktives Testen

Ein Ansatz für nicht interaktive Tests besteht darin, Benutzerklicks auf der vom Emulator bereitgestellten Anmeldeseite zu automatisieren. Verwenden Sie für Web-Apps eine Steuerungsschnittstelle wie WebDriver. Verwenden Sie für Mobilgeräte die UI-Testtools Ihrer Plattform, z. B. Espresso oder Xcode.

Alternativ können Sie Ihren Code aktualisieren, um signInWithCredential zu verwenden (z. B. in einem Codezweig) und einen Token-Authentifizierungsfluss mit Schein-ID-Tokens für Konten anstelle echter Anmeldeinformationen verwenden.

  1. Verdrahten Sie den Teil Ihres Codes, der idTokens vom IDP abruft, neu oder kommentieren Sie ihn aus. Dadurch entfällt die Notwendigkeit, während Ihrer Tests echte Benutzernamen und Passwörter einzugeben, und Ihre Tests werden von API-Kontingenten und Ratenbeschränkungen beim IDP entlastet.
  2. Zweitens verwenden Sie eine literale JSON-Zeichenfolge anstelle des Tokens für signInWithCredential . Am Beispiel des Web-SDK können Sie den Code wie folgt ändern:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

Bei Verwendung mit dem Emulator authentifiziert dieser Code erfolgreich einen Benutzer mit der E-Mail-Adresse foo@example.com bei Google. Stellen Sie sich das Unterfeld als Primärschlüssel vor, der in eine beliebige Zeichenfolge geändert werden kann und so die Anmeldung verschiedener Benutzer vortäuscht. Sie können firebase.auth.GoogleAuthProvider beispielsweise durch new firebase.auth.OAuthProvider('yahoo.com') oder eine andere Anbieter-ID ersetzen, die Sie verspotten möchten.

Emulierte benutzerdefinierte Token-Authentifizierung

Der Authentifizierungsemulator verarbeitet die Authentifizierung mit benutzerdefinierten JSON-Web-Tokens mithilfe von Aufrufen der signInWithCustomToken Methode auf unterstützten Plattformen, wie in der Produktionsauthentifizierungsdokumentation beschrieben.

Wie sich der Authentifizierungsemulator von der Produktion unterscheidet

Der Firebase Authentication-Emulator simuliert viele Funktionen des Produktionsprodukts. Da jedoch jede Art von Authentifizierungssystem stark auf Sicherheit auf mehreren Ebenen angewiesen ist (Gerät, Drittanbieter, Firebase usw.), ist es für den Emulator schwierig, alle Abläufe ordnungsgemäß nachzubilden.

Cloud-IAM

Die Firebase Emulator Suite versucht nicht, IAM-bezogenes Verhalten bei der Ausführung zu reproduzieren oder zu respektieren. Emulatoren halten sich an die bereitgestellten Firebase-Sicherheitsregeln, aber in Situationen, in denen IAM normalerweise verwendet wird, beispielsweise zum Festlegen von Cloud Functions, die ein Dienstkonto und damit Berechtigungen aufrufen, ist der Emulator nicht konfigurierbar und verwendet das global verfügbare Konto auf Ihrem Entwicklercomputer. Ähnlich wie die direkte Ausführung eines lokalen Skripts.

Da auf mobilen Plattformen die E-Mail-Link-Anmeldung auf Firebase Dynamic Links basiert, werden alle derartigen Links stattdessen auf der (mobilen) Webplattform geöffnet.

Anmeldung durch Dritte

Bei Anmeldeabläufen von Drittanbietern stützt sich die Firebase-Authentifizierung auf sichere Anmeldeinformationen von Drittanbietern wie Twitter und Github.

Echte Anmeldeinformationen von OpenID Connect-Anbietern wie Google und Apple werden vom Authentifizierungsemulator akzeptiert. Anmeldeinformationen von Nicht-OpenID Connect-Anbietern werden nicht unterstützt.

E-Mail-/SMS-Anmeldung

In Produktionsanwendungen umfassen E-Mail- und SMS-Anmeldeflüsse einen asynchronen Vorgang, bei dem der Benutzer eine empfangene Nachricht überprüft und einen Anmeldecode in eine Anmeldeschnittstelle eingibt. Der Authentifizierungsemulator sendet keine E-Mails oder SMS-Nachrichten, generiert aber, wie oben beschrieben, Anmeldecodes und gibt sie zur Verwendung beim Testen an das Terminal aus.

Der Emulator unterstützt nicht die Möglichkeit, Testtelefonnummern mit festen Anmeldecodes zu definieren, wie dies mit der Firebase-Konsole möglich ist.

Benutzerdefinierte Token-Authentifizierung

Der Authentifizierungsemulator validiert weder die Signatur noch den Ablauf benutzerdefinierter Token. Dies ermöglicht Ihnen die Verwendung handgefertigter Token und die unbegrenzte Wiederverwendung von Token in Prototyping- und Testszenarien.

Ratenbegrenzung / Missbrauchsbekämpfung

Der Authentifizierungsemulator repliziert keine Funktionen zur Begrenzung der Produktionsrate oder zur Missbrauchsbekämpfung.

Sperrfunktionen

In der Produktion werden Benutzer einmal in den Speicher geschrieben, nachdem die Ereignisse beforeCreate und beforeSignIn ausgelöst wurden. Aufgrund technischer Einschränkungen schreibt der Authentifizierungsemulator jedoch zweimal in den Speicher, einmal nach der Benutzererstellung und einmal nach der Anmeldung. Das bedeutet, dass Sie für neue Benutzer getAuth().getUser() erfolgreich in beforeSignIn im Authentifizierungsemulator aufrufen können, in der Produktion würde dabei jedoch ein Fehler auftreten.

Was als nächstes?

  • Eine kuratierte Reihe von Videos und detaillierten Anleitungsbeispielen finden Sie in der Firebase Emulators Training Playlist .

  • Da ausgelöste Funktionen eine typische Integration mit der Authentifizierung darstellen, erfahren Sie mehr über den Cloud Functions for Firebase-Emulator unter Funktionen lokal ausführen .