Łączenie aplikacji z emulatorem uwierzytelniania

Zanim zaczniesz używać emulatora Authentication w aplikacji, upewnij się, że rozumiesz ogólny przepływ pracy w Firebase Local Emulator Suite oraz że zainstalowano i skonfigurowano Local Emulator Suite i zapoznano się z poleceniami interfejsu wiersza poleceń.

W tym temacie zakładamy, że masz już doświadczenie w tworzeniu rozwiązań Firebase Authentication do użytku produkcyjnego. W razie potrzeby zapoznaj się z dokumentacją dotyczącą połączenia platformy i techniki uwierzytelniania.

Co mogę zrobić za pomocą emulatora Authentication?

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

  • Tworzenie i aktualizowanie emulowanych kont użytkowników oraz zarządzanie nimi na potrzeby testowania uwierzytelniania za pomocą adresu e-mail i hasła, numeru telefonu i SMS-a, SMS-a i uwierzytelniania wielopoziomowego oraz zewnętrznego dostawcy tożsamości (np. Google)
  • Wyświetlanie i edytowanie emulowanych użytkowników
  • Prototypowe systemy uwierzytelniania za pomocą niestandardowych tokenów
  • Sprawdź komunikaty związane z uwierzytelnianiem na karcie Logi w interfejsie emulatora.

Wybierz projekt w Firebase

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

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

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

Typ projektu Funkcje Używanie z emulatorami
real

Rzeczywisty projekt w Firebase to taki, który został przez Ciebie utworzony i skonfigurowany (najprawdopodobniej w konsoli Firebase).

Rzeczywiste projekty zawierają aktywne zasoby, takie jak instancje baz danych, zasobniki, funkcje lub inne zasoby skonfigurowane dla danego projektu Firebase.

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

W przypadku usług, których nie emulujesz, aplikacje i kod będą wchodzić w interakcje z aktywnym zasobem (instancją bazy danych, zasobnikiem na dane, funkcją itp.).

Prezentacja

Projekt demonstracyjny Firebase nie ma prawdziwej konfiguracji Firebase ani aktywnych zasobów. Dostęp do tych projektów można zwykle uzyskać za pomocą programów ćwiczeń i innych samouczków.

Identyfikatory projektów demonstracyjnych mają prefiks demo-.

Podczas pracy z projektami w Firebase w wersji demonstracyjnej aplikacje i kod wchodzą w interakcje wyłącznie z emulatorami. Jeśli aplikacja spróbuje wejść w interakcję z zasobem, dla którego emulator nie jest uruchomiony, kod nie zadziała.

Zalecamy korzystanie z projektów demonstracyjnych, gdy tylko jest to możliwe. 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 kod przypadkowo wywoła nieemulowane zasoby (produkcyjne), nie ma możliwości zmiany danych, użycia ani naliczenia opłat.
  • Lepsza obsługa offline, ponieważ nie trzeba mieć dostępu do internetu, aby pobrać konfigurację pakietu SDK.

Instrumentowanie aplikacji pod kątem komunikacji z emulatorem

Pakiety SDK na Androida, iOS i do przeglądarek

Skonfiguruj konfigurację w aplikacji lub klasy testowe, aby umożliwić interakcję z emulatorem Authentication 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)
Unity
FirebaseAuth auth = FirebaseAuth.DefaultInstance;
// Connects to the Auth Emulator running on port 9099
auth.UseEmulator("127.0.0.1", 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 musisz niczego konfigurować, aby prototypować i testować interakcje między Authentication a Cloud Functions lub Firebase Security Rules w przypadku Cloud Firestore lub Realtime Database. Gdy emulator Authentication jest skonfigurowany i działają inne emulatory, automatycznie współpracują ze sobą.

Admin SDK s

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

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

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

Po ustawieniu zmiennej środowiskowej Firebase Admin SDK będzie akceptować niepodpisane tokeny identyfikatora i pliki cookie sesji wydane przez emulator Authentication (odpowiednio za pomocą metod verifyIdToken i createSessionCookie), aby ułatwić lokalne programowanie 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. Możesz przekazać identyfikator projektu bezpośrednio do initializeApp lub ustawić zmienną środowiskową GCLOUD_PROJECT.

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

Tokeny identyfikacji

Ze względów bezpieczeństwa emulator Authentication wydaje niepodpisane tokeny identyfikacji, które są akceptowane tylko przez inne emulatory Firebase lub pakiet Firebase Admin SDK po skonfigurowaniu. Te tokeny zostaną odrzucone przez usługi Firebase w środowisku produkcyjnym lub pakiet Firebase Admin SDK działający w trybie produkcyjnym (np. działanie domyślne bez opisanych powyżej kroków konfiguracji).

Uruchamianie emulatora

Możesz korzystać z emulatora Authentication interaktywnie za pomocą Emulator Suite UI i nieinteraktywnie za pomocą lokalnego interfejsu REST. W sekcjach poniżej opisano interaktywne i nieinteraktywne przypadki użycia.

Aby uruchomić emulator Authentication, jego interfejs REST i Emulator Suite UI, wykonaj:

firebase emulators:start

W przypadku uwierzytelniania anonimowego aplikacja może używać logiki logowania dla Twojej platformy (iOS, Android, sieć).

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

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

Po utworzeniu użytkownika testowego aplikacja może logować i wylogowywać użytkownika za pomocą logiki pakietu SDK dla Twojej platformy (iOS, Android, sieć).

Aby przetestować procesy potwierdzania adresu e-mail i logowania się za pomocą linku w e-mailu, emulator wyświetla adres URL w terminalu, w którym wykonano 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 w przeglądarce, aby zasymulować zdarzenie weryfikacji, i sprawdź, czy weryfikacja się powiodła.

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

W przypadku testowania resetowania hasła emulator wyświetla w terminalu podobny adres URL, który zawiera parametr newPassword (możesz go zmienić w razie potrzeby).

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ć kodu Emulator Suite UI lub kodu klienta do zarządzania kontami użytkowników z adresem e-mail i hasłem, możesz napisać skrypty konfiguracji testów, które wywołują interfejsy API typu REST, aby tworzyć i usuwać konta użytkowników oraz pobierać kody weryfikacyjne adresu e-mail poza pasmem, aby wypełnić adres URL do weryfikacji adresu e-mail w emulatorze. Dzięki temu kod platformy i testu są od siebie oddzielone, co umożliwia testowanie bez interakcji.

W przypadku nieinteraktywnych procesów testowych adresu e-mail i hasła typowa sekwencja jest następująca:

  1. Tworzenie użytkowników za pomocą punktu końcowego REST signUp Authentication.
  2. Zaloguj użytkowników za pomocą adresów e-mail i haseł, aby przeprowadzić testy.
  3. Jeśli dotyczy to Twoich testów, pobierz dostępne kody potwierdzania adresu e-mail poza pasmem z punktu końcowego REST emulatora.
  4. Usuń rekordy użytkowników za pomocą punktu końcowego REST emulatora, aby wyczyścić dane.

Emulowane uwierzytelnianie przez telefon/SMS

W przypadku uwierzytelniania przez telefon emulator uwierzytelniania nie obsługuje:

  • reCAPTCHA i APN. Po skonfigurowaniu do interakcji z emulatorem pakiety SDK klienta wyłączają te metody weryfikacji w sposób podobny do opisanego w przypadku testów integracyjnych (iOS, Android, sieć).
  • Przetestuj numery telefonów ze wstępnie skonfigurowanymi kodami w konsoli Firebase.

W pozostałych kwestiach dotyczących kodu klienta proces uwierzytelniania przez telefon lub SMS-a jest identyczny z opisanym w przypadku środowiska produkcyjnego (iOS, Android, sieć).

Korzystanie z Emulator Suite UI:

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

Jednak w przypadku procesów uwierzytelniania przez telefon emulator NIE wywoła dostarczenia żadnych SMS-ów, ponieważ kontakt z operatorem jest poza zakresem i nie jest przyjazny dla testów lokalnych. Zamiast tego emulator wyświetla kod, który zostałby wysłany SMS-em, w tym samym terminalu, w którym uruchomiono polecenie firebase emulators:start. Wprowadź ten kod w aplikacji, aby zasymulować sprawdzanie SMS-ów przez użytkowników.

Testowanie nieinteraktywne

Aby przetestować nieinteraktywne uwierzytelnianie telefoniczne, użyj interfejsu REST API emulatora Authentication, aby pobrać dostępne kody SMS. Pamiętaj, że kod jest inny za każdym razem, gdy rozpoczynasz proces.

Typowa sekwencja wygląda tak:

  1. Aby rozpocząć proces weryfikacji, zadzwoń na platformę signInWithPhoneNumber.
  2. Pobierz kod weryfikacyjny za pomocą punktu końcowego REST dla emulatora.
  3. Zadzwoń pod numer confirmationResult.confirm(code) jak zwykle, podając kod weryfikacyjny.

Uwierzytelnianie wielopoziomowe przy użyciu SMS-ów

Emulator Authentication obsługuje prototypowanie i testowanie przepływów uwierzytelniania wieloskładnikowego (MFA) przez SMS dostępnych 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 drugim składnikiem. Komunikaty są wyświetlane w tym samym terminalu, w którym uruchomiono firebase emulators:start, i są dostępne w interfejsie REST.

Emulowane uwierzytelnianie zewnętrznego dostawcy tożsamości (IDP)

Emulator Authentication umożliwia testowanie wielu procesów uwierzytelniania innych firm w aplikacjach na iOS, Androida lub w aplikacjach internetowych 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 aplikacji.

Ogólnie rzecz biorąc, możesz użyć pakietu SDK Firebase do uwierzytelniania na jeden z dwóch sposobów:

  • Aplikacja pozwala pakietowi SDK obsługiwać cały proces, w tym wszystkie interakcje z zewnętrznymi dostawcami tożsamości w celu pobrania danych logowania.
  • Aplikacja ręcznie pobiera dane logowania od dostawcy zewnętrznego za pomocą pakietu SDK tego dostawcy i przekazuje je do pakietu SDK Authentication.

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

Testowanie przepływów dostawców tożsamości opartych na pakiecie SDK Firebase

Jeśli Twoja aplikacja korzysta z kompleksowego przepływu pakietu SDK Firebase, takiego jak OAuthProvider do logowania się za pomocą konta Microsoft, GitHub lub Yahoo, na potrzeby testów interaktywnych emulator Authentication udostępnia lokalną wersję odpowiedniej strony logowania, aby pomóc Ci przetestować uwierzytelnianie z aplikacji internetowych, które wywołują metodę signinWithPopup lub signInWithRedirect. Ta strona logowania wyświetla się też w aplikacjach mobilnych, renderowana przez bibliotekę WebView platformy.

Emulator tworzy w razie potrzeby próbne konta użytkowników i dane logowania w usługach zewnętrznych w miarę postępu procesów.

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

Jeśli używasz „ręcznych” technik logowania i wywołujesz metodę signInWithCredentials swojej platformy, aplikacja będzie prosić o prawdziwe logowanie przez usługę zewnętrzną i pobierać prawdziwe dane logowania do usługi zewnętrznej.

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

Testowanie nieinteraktywne

Jednym ze sposobów na testowanie nieinteraktywne jest automatyzacja kliknięć użytkownika na stronie logowania wyświetlanej przez emulator. W przypadku aplikacji internetowych użyj interfejsu sterowania, takiego jak WebDriver. W przypadku urządzeń mobilnych użyj narzędzi do testowania interfejsu na swojej platformie, np. Espresso lub Xcode.

Możesz też zaktualizować kod, aby używać signInWithCredential (np. w gałęzi kodu), i użyć przepływu uwierzytelniania tokenem z próbnymi tokenami identyfikacji dla kont zamiast prawdziwych danych logowania.

  1. Zmień lub zmień w komentarz część kodu, która pobiera tokeny idToken od dostawcy tożsamości. Dzięki temu nie trzeba będzie wprowadzać 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. Po drugie, zamiast tokena signInWithCredential użyj ciągu literału JSON. Na przykładzie pakietu SDK dla stron internetowych możesz zmienić kod na:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

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

Uwierzytelnianie za pomocą emulowanego tokena niestandardowego

Emulator Authentication obsługuje uwierzytelnianie za pomocą niestandardowych tokenów sieciowych JSON, używając 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 Firebase Authentication symuluje wiele funkcji usługi produkcyjnej. Ponieważ jednak każdy system uwierzytelniania opiera się w dużej mierze na zabezpieczeniach na wielu poziomach (urządzenie, dostawcy zewnętrzni, Firebase itp.), emulatorowi trudno jest prawidłowo odtworzyć wszystkie przepływy.

Cloud IAM

Pakiet emulatora Firebase nie próbuje replikować ani uwzględniać żadnych zachowań związanych z uprawnieniami podczas działania. Emulatory przestrzegają podanych reguł zabezpieczeń Firebase, ale w sytuacjach, w których zwykle używany jest protokół IAM, np. do ustawiania konta usługi wywołującego Cloud Functions, a tym samym uprawnień, emulatora nie można skonfigurować i będzie on używać konta dostępnego globalnie na komputerze używanym do programowania, podobnie jak w przypadku bezpośredniego uruchamiania skryptu lokalnego.

Na platformach mobilnych logowanie za pomocą linku w e-mailu korzysta z linków dynamicznych Firebase, dlatego wszystkie takie linki będą otwierane na platformie internetowej (mobilnej).

Logowanie przez inną usługę

W przypadku procesów logowania przez usługę zewnętrzną Firebase Authentication korzysta z bezpiecznych danych uwierzytelniających 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 zgodnie z opisem powyżej generuje kody logowania i wyświetla je w terminalu, aby można było ich używać podczas 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ć za pomocą konsoli Firebase.

Uwierzytelnianie za pomocą tokena niestandardowego

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

Ograniczanie liczby żądań / zapobieganie nadużyciom

Emulator Authentication nie odtwarza funkcji ograniczania liczby żądań ani funkcji zapobiegania nadużyciom w środowisku produkcyjnym.

Funkcje blokujące

W środowisku produkcyjnym użytkownicy są zapisywani w pamięci raz po wywołaniu zdarzeń beforeCreate i beforeSignIn. Jednak ze względu na ograniczenia techniczne emulator Authentication zapisuje dane w magazynie dwukrotnie: raz po utworzeniu użytkownika i drugi raz po zalogowaniu. Oznacza to, że w przypadku nowych użytkowników możesz wywołać funkcję getAuth().getUser() w beforeSignIn w emulatorze Authentication, ale w środowisku produkcyjnym wystąpi błąd.

Co dalej?