Łączenie aplikacji z emulatorem uwierzytelniania

Zanim użyjesz emulatora Authentication w swojej aplikacji, zapoznaj się z całym procesem Firebase Local Emulator Suite oraz zainstaluj i skonfiguruj Local Emulator Suite i sprawdź jego polecenia wiersza poleceń.

W tym temacie zakładamy, że wiesz już, jak tworzyć Firebase Authenticationrozwiązania na potrzeby produkcji. 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 lokalną emulację usług Firebase Authentication o wysokiej jakości, oferując wiele funkcji dostępnych w produkcyjnej wersji Firebase Authentication. W połączeniu z platformami Apple, pakietami SDK Firebase na Androida i do klienta internetowego emulator umożliwia:

  • Tworzenie i aktualizowanie emulowanych kont użytkowników oraz zarządzanie nimi na potrzeby testowania uwierzytelniania poczty e-mail i hasła, numeru telefonu i SMS-ów, wielopoziomowego uwierzytelniania SMS-ów oraz uwierzytelniania za pomocą narzędzi innych firm (np. Google)
  • Wyświetlanie i edytowanie emulowanych użytkowników
  • Prototypowe systemy uwierzytelniania tokenami niestandardowymi
  • Sprawdź komunikaty związane z uwierzytelnianiem na karcie Logi interfejsu emulatora.

Wybieranie projektu Firebase

Firebase Local Emulator Suite emuluje usługi w pojedynczym projekcie Firebase.

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

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

Typ projektu Funkcje Używanie z emulatorami
Prawdziwe

Prawdziwy projekt Firebase to projekt utworzony i skonfigurowany przez Ciebie (najprawdopodobniej za pomocą konsoli Firebase).

Prawdziwe projekty mają aktywne zasoby, takie jak instancje bazy danych, kontenery magazynu, funkcje lub inne zasoby skonfigurowane w danym projekcie Firebase.

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

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

Wersja demonstracyjna

Demonstracyjny projekt Firebase nie ma rzeczywistej konfiguracji Firebase i żadnych zasobów w produkcji. Dostęp do tych projektów uzyskuje się zwykle w ramach ćwiczeń z programowania lub innych samouczków.

Identyfikatory projektów demonstracyjnych mają prefiks demo-.

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

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

  • Łatwiejsza konfiguracja, ponieważ emulatory można uruchamiać bez konieczności tworzenia projektu Firebase.
  • Większe bezpieczeństwo, ponieważ jeśli Twój kod przypadkowo wywoła nieemulowane (produkcyjne) zasoby, nie ma możliwości zmiany danych, ich użycia ani rozliczenia.
  • Lepsza obsługa offline – nie musisz łączyć się z internetem, aby pobrać konfigurację pakietu SDK.

Przetestuj aplikację w interakcji z emulatorem

Pakiety SDK na Androida, iOS i aplikacje internetowe

Aby skonfigurować konfigurację w aplikacji lub przetestować klasy, które mają wchodzić w interakcję z emulatorem Authentication, wykonaj te czynności:

Kotlin+KTX
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 musisz nic konfigurować, aby tworzyć prototypy i testować interakcje między AuthenticationCloud Functions lub Firebase Security Rules w przypadku Cloud Firestore lub Realtime Database. Gdy skonfigurujesz emulator Authentication i uruchomisz inne emulatory, będą one automatycznie ze sobą współpracować.

Admin SDK s

Po ustawieniu zmiennej środowiskowej FIREBASE_AUTH_EMULATOR_HOST 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 rozpoznaje emulator Authentication, więc możesz pominąć ten krok podczas testowania integracji między emulatorami Cloud FunctionsAuthentication. Zmienna środowiskowa zostanie automatycznie ustawiona dla Admin SDK w Cloud Functions.

Gdy zmienna środowiskowa jest ustawiona, Firebase Admin SDK będzie akceptować niepodpisane tokeny identyfikatorów i pliki cookie sesji wydawane przez emulator Authentication (odpowiednio za pomocą metod verifyIdTokencreateSessionCookie), aby ułatwić lokalny rozwój i testowanie. Pamiętaj, aby nie ustawiać zmiennej środowiskowej w produkcji.

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

Pakiet Node.js Admin SDK
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 tokeny identyfikacyjne, które są akceptowane tylko przez inne emulatory Firebase lub pakiet SDK Firebase Admin, jeśli został skonfigurowany. Te tokeny zostaną odrzucone przez produkcyjne usługi Firebase lub pakiet Firebase Admin SDK działający w produkcyjnym trybie pracy (np. domyślne działanie bez opisanych powyżej kroków konfiguracji).

Uruchom emulator

Emulatora Authentication możesz używać interaktywnie za pomocą interfejsu Emulator Suite UI, a w sposób nieinteraktywny – przez lokalny interfejs REST. W następnych sekcjach omawiamy przypadki użycia interaktywnych i nieinteraktywnych.

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

firebase emulators:start

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

W przypadku uwierzytelniania za pomocą adresu e-mail i hasła możesz zacząć tworzyć prototypy, dodając do emulatora Authentication konta użytkowników w aplikacji za pomocą metod pakietu SDK Authentication lub używając pakietu 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 e-mail.

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

Aby przetestować weryfikację adresu e-mail lub logowanie się za pomocą linków w e-mailu, emulator wyświetla adres URL w terminalu, na którym został wykonany 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 symulować zdarzenie weryfikacji, i sprawdź, czy weryfikacja się udała.

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

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

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

Testy nieinteraktywne

Zamiast używać interfejsu Emulator Suite UI lub kodu klienta do zarządzania kontami użytkowników (e-mail i hasło), możesz napisać skrypty testowe, które wywołują interfejsy API REST w celu tworzenia i usuwania kont użytkowników oraz pobierania dodatkowych kodów weryfikacyjnych e-maila w celu wypełnienia adresu URL weryfikacji e-maila w emulatorze. Dzięki temu kod platformy i testowy są rozdzielone, a Ty możesz przeprowadzać testy bez interakcji.

W przypadku nieinteraktywnych procedur testowania poczty e-mail i haseł sekwencja wygląda następująco.

  1. Utwórz użytkowników za pomocą Authentication punktu końcowego REST signUp.
  2. Zaloguj użytkowników, używając ich adresów e-mail i haseł, aby przeprowadzić testy.
  3. W razie potrzeby pobierz dostępne zweryfikowane e-mailem kody z punktu końcowego REST dla konkretnego emulatora.
  4. Wyczyść rekordy użytkowników za pomocą punktu końcowego REST dla danego emulatora, aby usunąć dane.

Emulowane uwierzytelnianie przez telefon/SMS-y

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

  • procesy reCAPTCHA i APN. Po skonfigurowaniu interakcji z emulatorem pakiety SDK klienta wyłączają te metody weryfikacji w sposób podobny do opisanego w przypadku testów integracyjnych (iOS, Android, web).
  • Testowanie numerów telefonów z kodami skonfigurowanymi w konsoli Firebase.

W pozostałych aspektach kod klienta w przypadku uwierzytelniania przez telefon lub SMS jest identyczny jak w wersji produkcyjnej (iOS, Android, internet).

Korzystanie z usługi Emulator Suite UI:

  1. Na stronie 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 przez telefon.

Jednak w przypadku procesów uwierzytelniania przez telefon emulator NIE uruchamia wysyłania żadnych SMS-ów, ponieważ kontaktowanie się z operatorem wykracza poza zakres testów lokalnych i nie jest przyjazne dla użytkownika. Zamiast tego emulator wyświetla kod wysłany SMS-em na tym samym terminalu, na którym został uruchomiony firebase emulators:start. Wpisz go w aplikacji, aby symulować użytkownika sprawdzającego SMS-y.

Testy nieinteraktywne

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

Zazwyczaj wygląda to tak.

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

Uwierzytelnianie wielopoziomowe przy użyciu SMS-ów

Emulator Authentication umożliwia prototypowanie i testowanie wieloetapowych procesów uwierzytelniania SMS-em dostępnych w produkcji na iOS, Androidzie i w internecie.

Po dodaniu do emulatora przykładowego użytkownika możesz włączyć MFA i skonfigurować co najmniej 1 numer telefonu, na który będą wysyłane SMS-y drugiego składnika. Komunikaty wyświetlane są na tym samym terminalu, na którym uruchomiono firebase emulators:start, i są dostępne w interfejsie REST.

Emulowane uwierzytelnianie przez zewnętrznego dostawcę tożsamości

Emulator Authentication umożliwia testowanie wielu przepływów uwierzytelniania innych firm w aplikacjach na iOS, Androida lub w witrynach bez wprowadzania 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 uwierzytelniać użytkowników za pomocą pakietu SDK Firebase na 1 z 2 sposobów:

  • Aplikacja pozwala pakietowi SDK obsługiwać cały proces od początku do końca, w tym wszystkie interakcje z zewnętrzymi dostawcami usług tożsamości, które są niezbędne do pobrania danych logowania.
  • Aplikacja ręcznie pobiera dane logowania od zewnętrznego dostawcy za pomocą jego pakietu SDK i przekazuje je do pakietu SDK Authentication.

Ponownie kliknij link do dokumentacji powyżej i upewnij się, że znasz proces, którego chcesz użyć: zarządzanie przez pakiet SDK Firebase lub ręczne pobieranie danych logowania. Emulator Authentication obsługuje testowanie w obu przypadkach.

Testowanie procesów IDP obsługiwanych przez pakiet Firebase SDK

Jeśli Twoja aplikacja korzysta z dowolnego kompleksowego procesu z pakietu SDK Firebase, np. OAuthProvider do logowania się przez Microsoft, GitHub lub Yahoo, do testów interaktywnych, emulator Authentication udostępnia lokalną wersję odpowiedniej strony logowania, aby ułatwić Ci przetestowanie uwierzytelniania aplikacji internetowych, które wywołują metodę signinWithPopup lub signInWithRedirect. Ta lokalnie wyświetlana strona logowania pojawia się też w aplikacjach mobilnych renderowanych przez bibliotekę przeglądarki internetowej Twojej platformy.

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

Testowanie przepływó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 będzie jak zwykle prosić o logowanie się w usłudze innej firmy i pobierać jej dane logowania.

Pamiętaj, że emulator obsługuje tylko uwierzytelnianie signInWithCredential za pomocą danych logowania pobranych z funkcji logowania Google, Apple i innych dostawców, którzy używają tokenów identyfikacyjnych 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 alternatywne rozwiązanie w takich przypadkach.

Testy nieinteraktywne

Jednym z podejść do testowania nieinterakcyjnego jest zautomatyzowanie kliknięć użytkownika na stronie logowania wyświetlanej przez emulator. W przypadku aplikacji internetowych używaj interfejsu sterowania, takiego jak WebDriver. W przypadku urządzeń mobilnych użyj narzędzia do testowania interfejsu użytkownika na swojej platformie, np. Espresso lub Xcode.

Możesz też zaktualizować kod, aby używać signInWithCredential(np. w gałęzi kodu), i używać przepływu uwierzytelniania za pomocą tokenów z udawanymi tokenami identyfikatorów kont zamiast prawdziwych danych logowania.

  1. Zmień lub skomentuj część kodu, która pobiera tokeny identyfikacyjne z dostawcy tożsamości. Dzięki temu nie będziesz musiał(-a) podawać prawdziwych nazw użytkowników i haseł podczas testów, a testy nie będą obciążać limitów interfejsu API i limitów szybkości dostawcy tożsamości.
  2. Po drugie, zamiast tokena signInWithCredential użyj dosłownego ciągu znaków JSON. Na przykład w pakiecie SDK do przeglądarek możesz zmienić kod, aby:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

Gdy jest używany z emulatorem, ten kod umożliwia uwierzytelnienie użytkownika z adresem e-mail foo@example.com w Google. Uważaj to pole podrzędne za klucz główny, który można zmienić na dowolny ciąg znaków, symulując podpisywanie przez 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ć.

Emulowane uwierzytelnianie za pomocą tokenu niestandardowego

Emulator Authentication obsługuje uwierzytelnianie za pomocą niestandardowych tokenów internetowych JSON, korzystając z metody signInWithCustomToken na obsługiwanych platformach zgodnie z opisem w dokumentacji Authentication na potrzeby produkcji.

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

Emulator Authentication Firebase symuluje wiele funkcji produkcyjnej wersji usługi. Każdy system uwierzytelniania wymaga jednak bezpieczeństwa na wielu poziomach (urządzenia, dostawcy zewnętrznych, Firebase itp.), dlatego emulatorowi trudno jest odpowiednio odtworzyć wszystkie przepływy.

Cloud IAM

Pakiet emulatorów Firebase nie próbuje odwzorowywać ani uwzględniać podczas działania żadnych zachowań związanych z IAM. Emulatory przestrzegają reguł zabezpieczeń Firebase, ale w sytuacjach, w których zwykle używane jest IAM, np. do konfigurowania wywołań konta usługi Cloud Functions i odpowiednich uprawnień, emulator nie jest konfigurowalny i używa konta dostępnego globalnie na Twoim urządzeniu dewelopera, podobnie jak w przypadku bezpośredniego uruchamiania skryptu lokalnego.

Na platformach mobilnych logowanie się za pomocą linku e-mailowego wymaga korzystania 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 z usług zewnętrznych Firebase Authentication korzysta z bezpiecznych danych logowania od dostawców zewnętrznych, takich jak Twitter czy GitHub.

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

Logowanie przez e-maila lub SMS-a

W aplikacjach produkcyjnych przepływy logowania przez e-maila 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 żadnych e-maili ani SMS-ów, ale jak opisano powyżej, generuje kody logowania i zwraca je do terminala do użycia podczas testów.

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

Uwierzytelnianie za pomocą niestandardowego tokena

Emulator Authentication nie weryfikuje podpisu ani daty wygaśnięcia tokenów niestandardowych. Dzięki temu możesz używać ręcznie tworzonych tokenów i ich wielokrotnego wykorzystywania w scenariuszach prototypowania i testowania.

Ograniczanie liczby żądań / zapobieganie nadużyciom

Emulator Authentication nie odwzorowuje funkcji ograniczania szybkości ani funkcji zapobiegania nadużyciom w wersji produkcyjnej.

Funkcje blokowania

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

Co dalej?