Łączenie aplikacji z emulatorem uwierzytelniania

Zanim zaczniesz używać emulatora Authentication w swojej aplikacji, upewnij się, że rozumiesz ogólny proces pracy z Firebase Local Emulator Suite, oraz że masz zainstalowany i skonfigurowany Local Emulator Suite i znasz jego polecenia interfejsu wiersza poleceń.

W tym artykule zakładamy, że znasz już proces tworzenia Firebase Authentication rozwiązań na potrzeby środowiska produkcyjnego. W razie potrzeby zapoznaj się z dokumentacją dotyczącą kombinacji platformy i metody uwierzytelniania.

Co mogę zrobić za pomocą emulatora Authentication?

Emulator Authentication zapewnia lokalną emulację usług Firebase Authentication o wysokiej wierności, udostępniając większość funkcji dostępnych w produkcyjnej wersji Firebase Authentication. W połączeniu z pakietami SDK Firebase na platformy Apple, Androida i internetowe emulator umożliwia:

  • tworzenie, aktualizowanie i zarządzanie emulowanymi kontami użytkowników na potrzeby testowania uwierzytelniania za pomocą adresu e-mail i hasła, numeru telefonu i SMS-a, uwierzytelniania wielopoziomowego za pomocą SMS-a oraz uwierzytelniania za pomocą zewnętrznego dostawcy tożsamości (np. Google);
  • wyświetlanie i edytowanie emulowanych użytkowników;
  • tworzenie prototypów systemów uwierzytelniania za pomocą tokenów niestandardowych;
  • sprawdzanie wiadomości związanych z uwierzytelnianiem na karcie Dzienniki w interfejsie emulatora.

Wybieranie projektu w Firebase

Firebase Local Emulator Suite emuluje produkty dla jednego projektu w Firebase.

Aby wybrać projekt, którego chcesz używać, przed uruchomieniem emulatorów wpisz w interfejsie wiersza poleceń w katalogu roboczym polecenie firebase use. Możesz też przekazać flagę --project do każdego polecenia emulatora.

Local Emulator Suite obsługuje emulację prawdziwych projektów Firebase i demonstracyjnych projektów.

Typ projektu Funkcje Używanie z emulatorami
Prawdziwy

Prawdziwy projekt w Firebase to projekt utworzony i skonfigurowany (najprawdopodobniej przez konsolę Firebase).

Prawdziwe projekty mają aktywne zasoby, takie jak instancje bazy danych, zasobniki pamięci , funkcje lub inne zasoby skonfigurowane w tym projekcie Firebase.

Podczas pracy z prawdziwymi projektami Firebase możesz uruchamiać emulatory wszystkich obsługiwanych usług.

W przypadku usług, które nie są emulowane, Twoje aplikacje i kod będą wchodzić w interakcje z aktywnym zasobem (instancją bazy danych, zasobnikiem pamięci, funkcją itp.).

Demonstracyjny

Demonstracyjny projekt w Firebase nie ma prawdziwej konfiguracji Firebase ani aktywnych zasobów. Dostęp do tych projektów jest zwykle uzyskiwany za pomocą warsztatów programistycznych lub innych samouczków.

Identyfikatory projektów demonstracyjnych mają prefiks demo-.

Podczas pracy z demonstracyjnymi projektami Firebase Twoje aplikacje i kod wchodzą w interakcje z emulatorami tylko. Jeśli aplikacja spróbuje wejść w interakcję z zasobem dla którego nie jest uruchomiony emulator, kod zakończy się niepowodzeniem.

Zalecamy, aby w miarę możliwości używać projektów demonstracyjnych. W ten sposób możesz zapewnić im dostęp do tych korzyści:

  • łatwiejsza konfiguracja, ponieważ możesz uruchamiać emulatory bez tworzenia projektu w Firebase;
  • większe bezpieczeństwo, ponieważ jeśli Twój kod przypadkowo wywoła nieemulowane (produkcyjne) zasoby, nie będzie możliwości zmiany danych, użycia ani rozliczenia;
  • lepsza obsługa offline, ponieważ nie musisz uzyskiwać dostępu do internetu, aby pobrać konfigurację pakietu SDK.

Instrumentowanie aplikacji do komunikacji z emulatorem

Pakiety SDK na Androida, iOS i do aplikacji internetowych

Skonfiguruj klasy testowe lub konfigurację w aplikacji tak, aby wchodziły w interakcje z Authentication emulatorem w ten sposób.

Kotlin
Firebase.auth.useEmulator("10.0.2.2", 9099)
Java
FirebaseAuth.getInstance().useEmulator("10.0.2.2", 9099);
Swift
Auth.auth().useEmulator(withHost:"127.0.0.1", port:9099)

Web

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

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

Web

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

Nie trzeba wykonywać żadnych dodatkowych czynności, aby tworzyć prototypy i testować interakcje między Authentication a Cloud Functions lub Firebase Security Rules dla Cloud Firestore lub Realtime Database. Gdy emulator Authentication jest skonfigurowany, a inne emulatory są uruchomione, działają one automatycznie.

Admin SDKs

Pakiety Firebase Admin SDK automatycznie łączą się z emulatorem Authentication, gdy ustawiona jest zmienna środowiskowa FIREBASE_AUTH_EMULATOR_HOST.

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

Pamiętaj, że emulator Cloud Functions automatycznie wykrywa emulator Authentication, więc podczas testowania integracji między emulatorami Cloud Functions i Authentication możesz pominąć ten krok. Zmienna środowiskowa zostanie automatycznie ustawiona w Admin SDK w Cloud Functions.

Gdy zmienna środowiskowa jest ustawiona, Firebase Admin SDK będą akceptować niepodpisane identyfikatory tokenów i pliki cookie sesji wydane przez emulator Authentication (odpowiednio za pomocą metod verifyIdToken i createSessionCookie), aby ułatwić lokalne tworzenie i testowanie. Pamiętaj, aby nie ustawiać zmiennej środowiskowej w środowisku produkcyjnym.

Jeśli chcesz, aby kod Admin SDK łączył się z udostępnionym emulatorem działającym w innym środowisku, musisz podać ten sam identyfikator projektu, który został ustawiony za pomocą interfejsu wiersza poleceń Firebase. Identyfikator projektu możesz przekazać bezpośrednio do initializeApp lub ustawić zmienną środowiskową GCLOUD_PROJECT.

Pakiet Admin SDK dla Node.js
admin.initializeApp({ projectId: "your-project-id" });
Zmienna środowiskowa
export GCLOUD_PROJECT="your-project-id"

Identyfikatory tokenów

Ze względów bezpieczeństwa emulator Authentication wydaje niepodpisane identyfikatory tokenów, które są akceptowane tylko przez inne emulatory Firebase lub pakiet Firebase Admin SDK, gdy jest skonfigurowany. Te tokeny zostaną odrzucone przez produkcyjne usługi Firebase lub pakiet Firebase Admin SDK działający w trybie produkcyjnym (np. domyślne zachowanie bez opisanych powyżej czynności konfiguracyjnych).

Uruchamianie emulatora

Możesz używać emulatora Authentication interaktywnie za pomocą Emulator Suite UI i nieinteraktywnie za pomocą lokalnego interfejsu REST. W kolejnych sekcjach opisujemy przypadki użycia interaktywnego i nieinteraktywnego.

Aby uruchomić emulator Authentication, jego interfejs REST i Emulator Suite UI, wykonaj te czynności:

firebase emulators:start

W przypadku uwierzytelniania anonimowego aplikacja może korzystać z logiki logowania na platformie (iOS, Android, internet).

W przypadku uwierzytelniania za pomocą adresu e-mail i hasła możesz zacząć tworzyć prototyp, dodając konta użytkowników do Authentication emulatora z aplikacji za pomocą metod pakietu SDK Authentication, lub za pomocą Emulator Suite UI.

  1. W Emulator Suite UI kliknij kartę Uwierzytelnianie.
  2. Kliknij przycisk Dodaj użytkownika.
  3. Postępuj zgodnie z instrukcjami kreatora tworzenia konta użytkownika, wypełniając pola uwierzytelniania za pomocą adresu e-mail.

Po utworzeniu użytkownika testowego aplikacja może logować i wylogowywać użytkownika za pomocą logiki pakietu SDK na platformie (iOS, Android, internet).

Aby przetestować weryfikację adresu e-mail lub logowanie za pomocą linku w e-mailu, emulator wyświetla w terminalu adres URL, w którym zostało wykonane polecenie 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

Wklej link do przeglądarki, aby zasymulować zdarzenie weryfikacji, i sprawdź, czy weryfikacja się powiodła.

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

Aby przetestować resetowanie hasła, emulator wyświetla w terminalu podobny adres URL, w tym parametr newPassword (który możesz w razie potrzeby zmienić).

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

Testowanie nieinteraktywne

Zamiast używać Emulator Suite UI lub kodu klienta do zarządzania kontami użytkowników z adresem e-mail i hasłem, możesz napisać skrypty konfiguracyjne testów, które wywołują interfejsy API typu REST, aby tworzyć i usuwać konta użytkowników oraz pobierać kody weryfikacyjne wysyłane e-mailem poza pasmem, aby wypełnić URL do weryfikacji adresu e-mail emulatora. Dzięki temu kod platformy i kod testowy są oddzielone, co umożliwia testowanie nieinteraktywne.

W przypadku nieinteraktywnych testów adresu e-mail i hasła typowa sekwencja jest taka:

  1. Twórz użytkowników za pomocą punktu końcowego REST rejestracji Authentication .
  2. Loguj użytkowników za pomocą adresów e-mail i haseł, aby przeprowadzać testy.
  3. Jeśli jest to wymagane w testach, pobierz dostępne kody weryfikacyjne wysyłane e-mailem poza pasmem z punktu końcowego REST specyficznego dla emulatora.
  4. Wyczyść rekordy użytkowników za pomocą punktu końcowego REST specyficznego dla emulatora, aby wyczyścić dane.

Emulowane uwierzytelnianie za pomocą telefonu lub SMS-a

W przypadku uwierzytelniania za pomocą telefonu emulator Uwierzytelniania nie obsługuje:

  • procesów reCAPTCHA i APN. Po skonfigurowaniu do współpracy z emulatorem pakiety SDK klienta wyłączają te metody weryfikacji w sposób podobny do opisanego w przypadku testów integracji (iOS, Android, internet).
  • testowych numerów telefonów z kodami wstępnie skonfigurowanymi w Firebase konsoli.

W przeciwnym razie, jeśli chodzi o kod klienta, proces uwierzytelniania za pomocą telefonu lub SMS-a jest identyczny z procesem opisanym w przypadku środowiska produkcyjnego (iOS, Android, internet).

Korzystanie z Emulator Suite UI:

  1. W Emulator Suite UI kliknij kartę Uwierzytelnianie.
  2. Kliknij przycisk Dodaj użytkownika.
  3. Postępuj zgodnie z instrukcjami kreatora tworzenia konta użytkownika, wypełniając pola uwierzytelniania za pomocą telefonu.

W przypadku procesów uwierzytelniania za pomocą telefonu emulator NIE będzie jednak wywoływać wysyłania SMS-ów, ponieważ kontaktowanie się z operatorem jest poza zakresem i nie jest wygodne w przypadku testów lokalnych. Zamiast tego emulator wyświetla kod, który zostałby wysłany SMS-em do tego samego terminala, w którym zostało uruchomione polecenie firebase emulators:start; wprowadź ten kod do aplikacji, aby zasymulować sprawdzanie SMS-ów przez użytkowników.

Testowanie nieinteraktywne

Aby przeprowadzić nieinteraktywne testy uwierzytelniania za pomocą telefonu, użyj emulatora Authentication interfejsu REST API, aby pobrać dostępne kody SMS. Pamiętaj, że kod jest inny za każdym razem, gdy rozpoczniesz proces.

Typowa sekwencja jest taka:

  1. Wywołaj platformę signInWithPhoneNumber, aby rozpocząć proces weryfikacji.
  2. Pobierz kod weryfikacyjny za pomocą punktu końcowego REST specyficznego dla emulatora.
  3. Wywołaj confirmationResult.confirm(code) jak zwykle za pomocą kodu weryfikacyjnego.

Uwierzytelnianie wielopoziomowe za pomocą SMS-a

Emulator Authentication obsługuje tworzenie prototypów i testowanie procesów uwierzytelniania wielopoziomowego (MFA) za pomocą SMS-a, które są dostępne w środowisku produkcyjnym na iOS, Androidzie i w internecie.

Gdy dodasz do emulatora użytkownika testowego, możesz włączyć MFA i skonfigurować co najmniej 1 numer telefonu, na który będą wysyłane SMS-y z 2. poziomem uwierzytelniania. Wiadomości są wyświetlane w tym samym terminalu, w którym zostało uruchomione polecenie firebase emulators:start, i są dostępne w interfejsie REST.

Emulowane uwierzytelnianie za pomocą zewnętrznego dostawcy tożsamości

Emulator Authentication umożliwia testowanie wielu procesów uwierzytelniania za pomocą zewnętrznych dostawców w aplikacjach na iOS, Androida i w internecie bez wprowadzania zmian w kodzie produkcyjnym. Przykłady procesów uwierzytelniania znajdziesz w dokumentacji dotyczącej różnych kombinacji dostawców i platform, których możesz używać w swojej aplikacji.

Ogólnie rzecz biorąc, możesz używać pakietu SDK Firebase do uwierzytelniania na 2 sposoby:

  • Aplikacja umożliwia pakietowi SDK obsługę całego procesu, w tym wszystkich interakcji z zewnętrznymi dostawcami tożsamości w celu pobrania danych logowania.
  • Aplikacja ręcznie pobiera dane logowania od zewnętrznego dostawcy za pomocą jego pakietu SDK i przekazuje je do Authentication pakietu SDK.

Ponownie sprawdź link do dokumentacji powyżej i upewnij się, że znasz proces, którego chcesz używać – zarządzany przez [pakiet] SDK Firebase lub ręczne pobieranie danych logowania. Emulator Authentication obsługuje testowanie obu metod.

Testowanie procesów dostawcy tożsamości opartych na pakiecie SDK Firebase

Jeśli Twoja aplikacja używa dowolnego procesu pakietu SDK Firebase, np. OAuthProvider do logowania się za pomocą Microsoftu, GitHub lub Yahoo, emulator Authentication udostępnia lokalną wersję odpowiedniej strony logowania, aby pomóc Ci w testowaniu uwierzytelniania w aplikacjach internetowych, które wywołują metodę signinWithPopup lub signInWithRedirect. Ta lokalnie udostępniana strona logowania pojawia się też w aplikacjach mobilnych renderowanych przez bibliotekę WebView platformy.

W miarę postępu procesów emulator tworzy w razie potrzeby testowe konta użytkowników i dane logowania.

Testowanie procesów dostawcy tożsamości z ręcznym pobieraniem danych logowania

Jeśli używasz „ręcznych” metod logowania i wywołujesz metodę signInWithCredentials platformy, aplikacja jak zwykle poprosi o prawdziwe logowanie za pomocą zewnętrznego dostawcy i pobierze prawdziwe dane logowania.

Pamiętaj, że emulator obsługuje uwierzytelnianie signInWithCredential tylko w przypadku danych logowania pobranych z Logowania przez Google, Apple i innych dostawców, którzy używają identyfikatorów tokenów zaimplementowanych jako tokeny internetowe JSON (JWT). Tokeny dostępu (np. te udostępniane przez Facebooka lub Twittera, które nie są tokenami JWT) nie są obsługiwane. W następnej sekcji omówimy alternatywę w tych przypadkach.

Testowanie nieinteraktywne

Jednym ze sposobów testowania nieinteraktywnego jest zautomatyzowanie kliknięć użytkownika na stronie logowania udostępnianej przez emulator. W przypadku aplikacji internetowych użyj interfejsu sterowania, takiego jak WebDriver. W przypadku aplikacji mobilnych użyj narzędzi do testowania interfejsu platformy, takich jak Espresso lub Xcode.

Możesz też zaktualizować kod, aby używał signInWithCredential (np. w gałęzi kodu), i używać procesu uwierzytelniania za pomocą tokena z testowymi identyfikatorami tokenów kont zamiast prawdziwych danych logowania.

  1. Zmień lub zakomentuj część kodu, która pobiera identyfikatory tokenów od dostawcy tożsamości. Dzięki temu nie musisz wpisywać prawdziwych nazw użytkowników i haseł podczas testów, a testy nie będą podlegać limitom interfejsu API i limitom liczby żądań u dostawcy tożsamości.
  2. Następnie użyj literału ciągu JSON zamiast tokena w signInWithCredential. Na przykładzie pakietu SDK do aplikacji internetowych możesz zmienić kod na:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

Gdy ten kod jest używany z emulatorem, pomyślnie uwierzytelni użytkownika z adresem e-mail foo@example.com w Google. Pole sub traktuj jako klucz podstawowy, który można zmienić na dowolny ciąg znaków, symulując logowanie różnych użytkowników. Możesz zastąpić firebase.auth.GoogleAuthProvider na przykład new firebase.auth.OAuthProvider('yahoo.com') lub dowolnym innym identyfikatorem dostawcy, który chcesz zasymulować.

Emulowane uwierzytelnianie za pomocą tokena niestandardowego

Emulator Authentication obsługuje uwierzytelnianie za pomocą niestandardowych tokenów internetowych JSON za pomocą wywołań metody signInWithCustomToken na obsługiwanych platformach, zgodnie z opisem w dokumentacji produkcyjnej Authentication.

Różnice między emulatorem Authentication a środowiskiem produkcyjnym

Emulator Authentication Firebase symuluje wiele funkcji usługi w środowisku produkcyjnym. Ponieważ jednak każdy system uwierzytelniania w dużym stopniu opiera się na zabezpieczeniach na wielu poziomach (urządzenie, dostawcy zewnętrzni, Firebase itp.), emulatorowi trudno jest prawidłowo odtworzyć wszystkie procesy.

Cloud IAM

Pakiet emulatorów Firebase nie próbuje replikować ani respektować żadnych zachowań związanych z IAM. Emulatory przestrzegają podanych reguł bezpieczeństwa Firebase, ale w sytuacjach, w których normalnie używany byłby IAM, np. do ustawienia konta usługi wywołującej Cloud Functions, a tym samym uprawnień, emulator nie jest konfigurowalny i będzie używać globalnie dostępnego konta na komputerze dewelopera, podobnie jak w przypadku bezpośredniego uruchamiania skryptu lokalnego.

Ponieważ na platformach mobilnych logowanie za pomocą linku w e-mailu opiera się na Linkach dynamicznych Firebase, wszystkie takie linki będą otwierane na platformie internetowej (mobilnej).

Logowanie przez inną usługę

W przypadku procesów logowania przez inną usługę Uwierzytelnianie Firebase Authentication opiera się na bezpiecznych danych logowania od zewnętrznych dostawców, takich jak Twitter i GitHub.

Emulator Authentication akceptuje prawdziwe dane logowania od dostawców OpenID Connect, takich jak Google i Apple. Dane logowania od dostawców innych niż OpenID Connect nie są obsługiwane.

Logowanie za pomocą adresu e-mail lub SMS-a

W aplikacjach produkcyjnych procesy logowania za pomocą adresu e-mail i SMS-a obejmują operację asynchroniczną, w której użytkownik sprawdza otrzymaną wiadomość i wpisuje kod logowania w interfejsie logowania. Emulator Authentication nie wysyła e-maili ani SMS-ów , ale jak opisano powyżej, generuje kody logowania i wyświetla je w terminalu, aby można było ich używać do testowania.

Emulator nie obsługuje możliwości definiowania testowych numerów telefonów ze stałymi kodami logowania, tak jak można to zrobić w konsoli Firebase.

Uwierzytelnianie za pomocą tokena niestandardowego

Emulator Authentication nie sprawdza podpisu ani daty ważności niestandardowych tokenów. Dzięki temu możesz używać ręcznie utworzonych tokenów i ponownie używać tokenów w nieskończoność w scenariuszach tworzenia prototypów i testowania.

Ograniczanie liczby żądań i ochrona przed nadużyciami

Emulator Authentication nie replikuje funkcji ograniczania liczby żądań ani ochrony przed nadużyciami w środowisku produkcyjnym.

Funkcje blokowania

W środowisku produkcyjnym użytkownicy są zapisywani w pamięci tylko raz po wywołaniu zdarzeń beforeCreate i beforeSignIn. Ze względu na ograniczenia techniczne, emulator Authentication zapisuje jednak w pamięci 2 razy – raz po utworzeniu użytkownika i raz po zalogowaniu. Oznacza to, że w przypadku nowych użytkowników możesz pomyślnie wywołać getAuth().getUser() w beforeSignIn w emulatorze Authentication, ale w środowisku produkcyjnym napotkasz błąd.

Co dalej?