Połącz swoją aplikację z emulatorem uwierzytelniania

Przed użyciem emulatora uwierzytelniania w aplikacji upewnij się, że rozumiesz ogólny przepływ pracy w pakiecie Firebase Local Emulator Suite , zainstaluj i skonfiguruj pakiet Local Emulator Suite oraz przejrzyj jego polecenia CLI .

W tym temacie założono, że znasz już tworzenie rozwiązań Firebase Authentication do celów produkcyjnych. W razie potrzeby przejrzyj dokumentację dotyczącą kombinacji platformy i techniki uwierzytelniania .

Co mogę zrobić z emulatorem uwierzytelniania?

Emulator uwierzytelniania zapewnia wysokiej jakości emulację lokalną usług uwierzytelniania Firebase, zapewniając wiele funkcji dostępnych w produkcyjnym uwierzytelnianiu Firebase . W połączeniu z platformami Apple, zestawami SDK Android i Web Firebase emulator umożliwia:

  • Twórz, aktualizuj i zarządzaj emulowanymi kontami użytkowników w celu testowania adresu e-mail/hasła, numeru telefonu/SMS-a, wieloskładnikowego SMS-a i uwierzytelniania zewnętrznego dostawcy tożsamości (np. Google)
  • Przeglądaj i edytuj emulowanych użytkowników
  • Prototypowe niestandardowe systemy uwierzytelniania tokenowego
  • Sprawdź komunikaty związane z uwierzytelnianiem na karcie Dzienniki interfejsu użytkownika emulatora.

Wybierz projekt Firebase

Pakiet Firebase Local Emulator Suite emuluje produkty dla pojedynczego projektu Firebase.

Aby wybrać projekt do użycia, przed uruchomieniem emulatorów, w CLI uruchom firebase use w swoim katalogu roboczym. Możesz też przekazać flagę --project do każdego polecenia emulatora.

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

Typ projektu Cechy Używaj z emulatorami
Prawdziwy

Prawdziwy projekt Firebase to taki, który utworzyłeś i skonfigurowałeś (najprawdopodobniej za pomocą konsoli Firebase).

Prawdziwe projekty mają aktywne zasoby, takie jak instancje baz danych, zasobniki pamięci, funkcje lub inne zasoby skonfigurowane dla tego projektu Firebase.

Pracując z prawdziwymi projektami Firebase, możesz uruchomić emulatory dla dowolnego lub wszystkich obsługiwanych produktów.

W przypadku wszystkich produktów, których nie emulujesz, Twoje aplikacje i kod będą wchodzić w interakcję z aktywnym zasobem (instancją bazy danych, zasobnikiem pamięci, funkcją itp.).

Próbny

Projekt demonstracyjny Firebase nie ma prawdziwej konfiguracji Firebase ani aktywnych zasobów. Dostęp do tych projektów można zwykle uzyskać za pośrednictwem ćwiczeń z programowania lub innych samouczków.

Identyfikatory projektów demonstracyjnych mają przedrostek demo- .

Podczas pracy z projektami demonstracyjnymi Firebase Twoje aplikacje i kod wchodzą w interakcję wyłącznie z emulatorami. Jeśli aplikacja podejmie próbę interakcji z zasobem, dla którego nie działa emulator, wykonanie kodu zakończy się niepowodzeniem.

W miarę możliwości zalecamy korzystanie z projektów demonstracyjnych. Korzyści obejmują:

  • Łatwiejsza konfiguracja, ponieważ możesz uruchomić emulatory bez tworzenia projektu Firebase
  • Większe bezpieczeństwo, ponieważ jeśli Twój kod przypadkowo wywoła nieemulowane zasoby (produkcyjne), nie ma szans na zmianę danych, wykorzystanie i rozliczenie
  • Lepsza obsługa w trybie offline, ponieważ nie ma potrzeby dostępu do Internetu, aby pobrać konfigurację SDK.

Instrumentuj swoją aplikację, aby komunikowała się z emulatorem

Zestawy SDK dla Androida, iOS i sieci Web

Skonfiguruj konfigurację w aplikacji lub klasy testowe do interakcji z emulatorem uwierzytelniania w następujący sposób.

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

Do prototypowania i testowania interakcji między uwierzytelnianiem a funkcjami chmury lub regułami bezpieczeństwa Firebase dla Cloud Firestore lub bazy danych czasu rzeczywistego nie jest wymagana żadna dodatkowa konfiguracja. Kiedy emulator uwierzytelniania jest skonfigurowany i działają inne emulatory, automatycznie współpracują one ze sobą.

Pakiety SDK administratora

Zestawy SDK administratora Firebase automatycznie łączą się z emulatorem uwierzytelniania, 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 rozpoznaje emulator uwierzytelniania, więc możesz pominąć ten krok podczas testowania integracji między emulatorami Cloud Functions i uwierzytelniania. Zmienna środowiskowa zostanie automatycznie ustawiona dla pakietu Admin SDK w Cloud Functions.

Po ustawieniu zmiennej środowiskowej zestawy SDK administratora Firebase będą akceptować tokeny identyfikacyjne bez znaku i pliki cookie sesji wydawane przez emulator uwierzytelniania (odpowiednio za pomocą metod verifyIdToken i createSessionCookie ) w celu ułatwienia lokalnego programowania i testowania. Upewnij się , że nie ustawiasz zmiennej środowiskowej w środowisku produkcyjnym.

Jeśli chcesz, aby Twój kod Admin SDK łączył się ze współdzielonym emulatorem działającym w innym środowisku, musisz podać ten sam identyfikator projektu, który ustawiłeś za pomocą interfejsu CLI Firebase . Możesz przekazać identyfikator projektu do bezpośredniego initializeApp lub ustawić zmienną środowiskową GCLOUD_PROJECT .

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

Tokeny identyfikacyjne

Ze względów bezpieczeństwa emulator uwierzytelniania wystawia niepodpisane tokeny identyfikacyjne, które są akceptowane tylko przez inne emulatory Firebase lub pakiet SDK administratora Firebase, jeśli są skonfigurowane . Tokeny te zostaną odrzucone przez produkcyjne usługi Firebase lub pakiet SDK administratora Firebase działający w trybie produkcyjnym (np. zachowanie domyślne bez opisanych powyżej kroków konfiguracji).

Uruchom emulator

Możesz używać emulatora uwierzytelniania interaktywnie za pośrednictwem interfejsu użytkownika pakietu Emulator Suite i nieinteraktywnie za pośrednictwem lokalnego interfejsu REST. W poniższych sekcjach opisano interaktywne i nieinteraktywne przypadki użycia.

Aby uruchomić emulator uwierzytelniania, jego interfejs REST i interfejs użytkownika pakietu emulatorów, wykonaj:

firebase emulators:start

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

W przypadku uwierzytelniania za pomocą poczty e-mail/hasła możesz rozpocząć tworzenie prototypów, dodając konta użytkowników do emulatora uwierzytelniania z aplikacji przy użyciu metod zestawu SDK uwierzytelniania lub korzystając z interfejsu użytkownika pakietu emulatorów.

  1. W interfejsie użytkownika pakietu Emulator Suite kliknij kartę Uwierzytelnianie .
  2. Kliknij przycisk Dodaj użytkownika .
  3. Postępuj zgodnie z kreatorem tworzenia konta użytkownika, wypełniając pola uwierzytelnienia e-mail.

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

W celu przetestowania weryfikacji/logowania przez e-mail za pomocą łączy e-mailowych emulator wypisuje adres URL na terminalu, na którym wykonano 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 weryfikacyjne i sprawdź, czy weryfikacja przebiegła pomyślnie.

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

W celu przetestowania resetowania hasła emulator wypisuje na terminalu podobny adres URL, zawierający parametr newPassword (który możesz 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ć interfejsu użytkownika pakietu Emulator Suite lub kodu klienta do zarządzania kontami użytkowników e-mailem/hasłem, możesz napisać skrypty konfiguracji testu, które wywołują interfejsy API REST w celu tworzenia i usuwania kont użytkowników oraz pobierania pozapasmowych kodów weryfikacyjnych e-mail w celu wypełnienia weryfikacji adresu e-mail emulatora Adres URL. Dzięki temu platforma i kod testowy są oddzielone i umożliwiają testowanie w sposób nieinteraktywny.

W przypadku nieinteraktywnych przepływów testów wiadomości e-mail i haseł typowa sekwencja jest następująca.

  1. Utwórz użytkowników z punktem końcowym REST dotyczącym rejestracji uwierzytelniania.
  2. Zaloguj użytkowników przy użyciu adresów e-mail i haseł, aby przeprowadzić testy.
  3. Jeśli ma to zastosowanie do Twoich testów, pobierz dostępne pozapasmowe kody weryfikacyjne e-mail z punktu końcowego REST specyficznego dla emulatora .
  4. Opróżnij rekordy użytkowników za pomocą punktu końcowego REST specyficznego dla emulatora w celu wyczyszczenia danych.

Emulowane uwierzytelnianie telefoniczne/SMS

W przypadku uwierzytelniania telefonicznego emulator Auth nie obsługuje:

  • Przepływy reCAPTCHA i APN. Po skonfigurowaniu do interakcji z emulatorem zestawy SDK klienta wyłączają te metody weryfikacji w sposób podobny do opisanego w przypadku testów integracyjnych ( iOS , Android , web ).
  • Przetestuj numery telefonów za pomocą kodów wstępnie skonfigurowanych w konsoli Firebase.

W przeciwnym razie, jeśli chodzi o kod klienta, proces uwierzytelniania przez telefon/SMS jest identyczny z opisanym dla wersji produkcyjnej ( iOS , Android , web ).

Korzystanie z interfejsu użytkownika pakietu emulatorów:

  1. W interfejsie użytkownika pakietu Emulator Suite kliknij kartę Uwierzytelnianie .
  2. Kliknij przycisk Dodaj użytkownika .
  3. Postępuj zgodnie z kreatorem tworzenia konta użytkownika, wypełniając pola uwierzytelnienia telefonu.

Jednak w przypadku uwierzytelniania telefonicznego emulator NIE spowoduje dostarczenia żadnych wiadomości tekstowych, ponieważ kontakt z operatorem wykracza poza zakres i nie jest przyjazny dla testów lokalnych! Zamiast tego emulator wypisuje kod, który zostałby wysłany SMS-em do tego samego terminala, na którym uruchomiłeś firebase emulators:start ; wprowadź ten kod do aplikacji, aby zasymulować sprawdzanie wiadomości tekstowych przez użytkowników.

Testowanie nieinteraktywne

W przypadku nieinteraktywnych testów uwierzytelniania telefonu użyj interfejsu API REST emulatora uwierzytelniania, aby pobrać dostępne kody SMS. Należy pamiętać, że kod jest inny za każdym razem, gdy inicjujesz przepływ.

Typowa sekwencja jest następująca.

  1. Zadzwoń do platformy signInWithPhoneNumber , aby rozpocząć proces weryfikacji.
  2. Pobierz kod weryfikacyjny, korzystając z punktu końcowego REST specyficznego dla emulatora .
  3. Zadzwoń na confirmationResult.confirm(code) jak zwykle, podając kod weryfikacyjny.

SMS-y wieloskładnikowe

Emulator uwierzytelniania obsługuje tworzenie prototypów i testowanie przepływów uwierzytelniania wieloskładnikowego SMS (MFA) dostępnych w środowisku produkcyjnym dla systemów iOS , Android i sieci Web .

Po dodaniu fałszywego użytkownika do emulatora możesz włączyć usługę MFA i skonfigurować jeden lub więcej numerów telefonów, na które będą wysyłane wiadomości SMS drugiego stopnia. Komunikaty są wysyłane do tego samego terminala, na którym uruchomiłeś firebase emulators:start i są dostępne z interfejsu REST.

Uwierzytelnianie emulowanego zewnętrznego dostawcy tożsamości (IDP).

Emulator uwierzytelniania umożliwia testowanie wielu przepływów uwierzytelniania innych firm w aplikacjach iOS, Android lub internetowych bez zmian w kodzie produkcyjnym. Przykłady przepływó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żyć pakietu SDK Firebase do uwierzytelnienia na jeden z dwóch sposobów:

  • Twoja aplikacja umożliwia pakietowi SDK kompleksową obsługę całego procesu, w tym wszystkich interakcji z zewnętrznymi dostawcami tożsamości w celu uzyskania poświadczeń.
  • Twoja aplikacja ręcznie pobiera poświadczenia od zewnętrznego dostawcy przy użyciu zestawu SDK tej firmy i przekazuje je do zestawu SDK uwierzytelniania.

Ponownie sprawdź powyższy link do dokumentacji i upewnij się, że znasz dowolny proces – zarządzany przez Firebase SDK czy ręczne pobieranie danych uwierzytelniających – którego chcesz użyć. Emulator uwierzytelniania obsługuje testowanie obu podejść.

Testowanie przepływów IDP opartych na pakiecie Firebase SDK

Jeśli Twoja aplikacja korzysta z kompleksowego przepływu pakietu SDK Firebase, takiego jak OAuthProvider do logowania się w Microsoft, GitHub lub Yahoo, na potrzeby testów interaktywnych, emulator uwierzytelniania udostępnia lokalną wersję odpowiedniej strony logowania, aby pomóc Ci przetestować uwierzytelnianie signinWithPopup aplikacji internetowych wywołujących metodęsigninWithPopup signInWithRedirect . Ta udostępniana lokalnie strona logowania pojawia się także w aplikacjach mobilnych renderowanych przez bibliotekę widoku internetowego Twojej platformy.

Emulator tworzy fałszywe konta użytkowników zewnętrznych i poświadczenia w miarę potrzeb w miarę postępu przepływów.

Testowanie przepływów IDP przy ręcznym pobieraniu poświadczeń

Jeśli użyjesz technik logowania „ręcznego” i wywołasz signInWithCredentials swojej platformy, wówczas, jak zwykle, Twoja aplikacja zażąda prawdziwego logowania przez stronę trzecią i pobierze prawdziwe poświadczenia strony trzeciej.

Należy pamiętać, że emulator obsługuje tylko uwierzytelnianie signInWithCredential w przypadku poświadczeń uzyskanych z usługi Google Sign-In, firmy Apple i innych dostawców korzystających z tokenów identyfikatora zaimplementowanych jako tokeny internetowe JSON (JWT). Tokeny dostępu (np. te dostarczane przez Facebooka lub Twittera, które nie są JWT) nie są obsługiwane. W następnej sekcji omówiono alternatywę w takich przypadkach.

Testowanie nieinteraktywne

Jednym z podejść do testów nieinteraktywnych jest automatyzacja kliknięć użytkowników na stronie logowania obsługiwanej 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 użytkownika ze swojej platformy, takich jak Espresso lub Xcode.

Alternatywnie możesz zaktualizować swój kod, aby korzystał z signInWithCredential (np. w gałęzi kodu) i korzystał z przepływu uwierzytelniania tokenowego z fałszywymi tokenami identyfikatora dla kont zamiast prawdziwych poświadczeń.

  1. Zmień połączenie lub skomentuj część kodu, która pobiera idTokens od dostawcy tożsamości; eliminuje to potrzebę wprowadzania prawdziwych nazw użytkowników i haseł podczas testów oraz zwalnia Twoje testy z limitów API i limitów szybkości w IDP.
  2. Po drugie, użyj dosłownego ciągu JSON zamiast tokenu signInWithCredential . Korzystając z internetowego pakietu SDK jako przykładu, 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 za pomocą adresu e-mail foo@example.com w Google. Pomyśl o podpolu jak o kluczu podstawowym, który można zmienić na dowolny ciąg, kpiąc z logowania 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, z którego chcesz kpić.

Emulowane uwierzytelnianie tokenu niestandardowego

Emulator uwierzytelniania obsługuje uwierzytelnianie za pomocą niestandardowych tokenów sieci Web JSON przy użyciu wywołań signInWithCustomToken na obsługiwanych platformach, zgodnie z opisem w dokumentacji dotyczącej uwierzytelniania produkcyjnego .

Czym emulator uwierzytelniania różni się od wersji produkcyjnej

Emulator Firebase Authentication symuluje wiele funkcji produktu produkcyjnego. Ponieważ jednak każdy rodzaj systemu uwierzytelniania w dużym stopniu opiera się na zabezpieczeniach na wielu poziomach (urządzenie, dostawcy zewnętrzni, Firebase itp.), emulatorowi trudno jest poprawnie odtworzyć wszystkie przepływy.

IAM w chmurze

Pakiet emulatora Firebase nie próbuje replikować ani szanować żadnych zachowań związanych z uprawnieniami podczas działania. Emulatory są zgodne z dostarczonymi regułami bezpieczeństwa Firebase, ale w sytuacjach, w których normalnie byłyby używane uprawnienia IAM, na przykład w celu ustawienia konta usługi wywołującej Cloud Functions, a tym samym uprawnień, emulator nie jest konfigurowalny i będzie korzystał z konta dostępnego globalnie na komputerze programisty, podobnie do bezpośredniego uruchamiania lokalnego skryptu.

Ponieważ na platformach mobilnych logowanie za pomocą linków e-mail opiera się na linkach dynamicznych Firebase, wszystkie takie linki będą zamiast tego otwierane na (mobilnej) platformie internetowej.

Logowanie przez stronę trzecią

W przypadku przepływów logowania przez strony trzecie uwierzytelnianie Firebase opiera się na bezpiecznych danych uwierzytelniających od zewnętrznych dostawców, takich jak Twitter i Github.

Prawdziwe dane uwierzytelniające od dostawców OpenID Connect, takich jak Google i Apple, są akceptowane przez emulator uwierzytelniania. Poświadczenia od dostawców innych niż OpenID Connect nie są obsługiwane.

Logowanie e-mailem/SMS-em

W aplikacjach produkcyjnych przepływy logowania za pomocą poczty e-mail i SMS-ów obejmują operację asynchroniczną, podczas której użytkownik sprawdza otrzymaną wiadomość i wprowadza kod logowania w interfejsie logowania. Emulator uwierzytelniania nie wysyła żadnych e-maili ani wiadomości SMS, ale jak opisano powyżej , generuje kody logowania i wysyła je do terminala w celu wykorzystania w testach.

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

Uwierzytelnianie tokenu niestandardowego

Emulator uwierzytelniania nie sprawdza podpisu ani wygaśnięcia tokenów niestandardowych. Pozwala to na używanie ręcznie wykonanych tokenów i ponowne wykorzystywanie tokenów w nieskończoność w scenariuszach prototypowania i testowania.

Ograniczanie szybkości / przeciwdziałanie nadużyciom

Emulator uwierzytelniania nie replikuje funkcji ograniczających wydajność produkcji ani zapobiegających nadużyciom.

Funkcje blokujące

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

Co następne?