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 przejrzyj 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 za pomocą adresu e-mail/hasła, numeru telefonu/SMS-a, SMS-a wielopoziomowego oraz zewnętrznego dostawcy tożsamości (np.Google).
- Wyświetlanie i edytowanie emulowanych użytkowników
- Prototypowanie systemów uwierzytelniania za pomocą niestandardowych tokenów
- Sprawdź komunikaty dotyczące uwierzytelniania na karcie Dzienniki 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ć parametr --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 |
---|---|---|
Real |
Prawdziwy projekt Firebase to taki, który został utworzony i skonfigurowany (najprawdopodobniej w 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 uruchamiać emulatory dla dowolnego lub wszystkich obsługiwanych produktów. W przypadku usług, których nie emulujesz, Twoje aplikacje i kod będą wchodzić w interakcję z aktywnymi zasobami (instancjami baz danych, zasobnikami magazynu, funkcjami itp.). |
Prezentacja |
Demonstracyjny projekt Firebase nie ma rzeczywistej konfiguracji Firebase i żadnych zasobów w produkcji. Do tych projektów zwykle uzyskuje się dostęp za pomocą ćwiczeń z programowania lub innych samouczków. Identyfikatory projektów demonstracyjnych mają prefiks |
Podczas pracy z demonstracyjnymi projektami Firebase aplikacje i kod będą wchodzić w interakcje z emulatorami tylko. Jeśli aplikacja próbuje wchodzić w interakcję z zasobem, dla którego nie działa emulowany system, kod nie zadziała. |
W miarę możliwości zalecamy korzystanie z 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 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, ich użycia ani rozliczenia.
- lepszą obsługę offline, ponieważ do pobrania konfiguracji pakietu SDK nie jest potrzebny dostęp do internetu;
Przeprowadź instrumentowanie aplikacji, aby komunikowała się z emulatorem
Pakiety SDK na Androida, iOS i do przeglądarek
Skonfiguruj konfigurację w aplikacji lub przetestuj klasy, aby nawiązywać interakcję z emulatorem Authentication w ten sposób:
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 Authentication a Cloud 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 Functions i Authentication. 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 verifyIdToken
i createSessionCookie
), aby ułatwić lokalny rozwój i testowanie. Pamiętaj, aby nie ustawiać zmiennej środowiskowej w produkcji.
Jeśli chcesz, aby kod Admin SDK łączył się z wspólnym emulatorem działającym w innym środowisku, musisz podać ten sam identyfikator projektu, który został ustawiony za pomocą 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. w przypadku domyślnego działania bez opisanych powyżej kroków konfiguracji).
Uruchom emulator
Możesz używać emulatora Authentication w trybie interaktywnym za pomocą interfejsu Emulator Suite UI lub w trybie nieinteraktywnym za pomocą lokalnego interfejsu REST. W następnych sekcjach omawiamy przypadki użycia interakcji i nieinterakcji.
Aby uruchomić emulator Authentication, jego interfejs REST i Emulator Suite UI, wykonaj:
firebase emulators:start
Emulacja poczty e-mail, link do e-maila i anonimowe uwierzytelnianie
W przypadku potwierdzenia tożsamości anonimowej aplikacja może stosować logikę logowania na danej platformie (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.
- Na stronie Emulator Suite UI kliknij kartę Uwierzytelnianie.
- Kliknij przycisk Dodaj użytkownika.
- 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ć go za pomocą logiki pakietu SDK na danej platformie (iOS, Android, web).
Aby przetestować weryfikację e-mailem lub logowanie z linkiem e-mail, emulator wypisuje adres URL do terminala, w 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 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"
}
}
W celu przetestowania funkcji resetowania hasła emulator wypisuje podobny adres URL, w tym parametr newPassword (który możesz zmienić w razie potrzeby) do terminala.
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 nieinterakcyjnych testów adresów e-mail i haseł typowa kolejność jest następująca:
- Utwórz użytkowników za pomocą Authentication punktu końcowego REST signUp.
- Zaloguj użytkowników, używając ich adresów e-mail i haseł, aby przeprowadzić testy.
- W razie potrzeby pobierz dostępne zweryfikowane e-mailem kody z punktu końcowego REST dla konkretnego emulatora.
- Wyczyść rekordy użytkowników za pomocą punktu końcowego REST dla danego emulatora, aby usunąć dane.
Uwierzytelnianie przez emulację telefonu lub SMS-a
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:
- Na stronie Emulator Suite UI kliknij kartę Uwierzytelnianie.
- Kliknij przycisk Dodaj użytkownika.
- 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żytkowników. Zamiast tego emulator wydrukuje kod, który zostałby wysłany SMS-em do tego samego terminala, na którym uruchomiono firebase emulators:start
. Wpisz ten kod w aplikacji, aby symulować sprawdzanie wiadomości tekstowych przez użytkowników.
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.
Typowa sekwencja wygląda tak:
- Aby rozpocząć proces weryfikacji, zadzwoń na platformę
signInWithPhoneNumber
. - Pobierz kod weryfikacyjny, korzystając z punktu końcowego REST dla emulatora.
- 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 fikcyjnego użytkownika możesz włączyć uwierzytelnianie wielopoziomowe i skonfigurować co najmniej 1 numer telefonu, na który będą wysyłane SMS-y z drugim poziomem uwierzytelniania. 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 procesów uwierzytelniania firm zewnętrznych w aplikacjach na iOS, Androida lub w witrynach internetowych 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 zapoznaj się z powyższym linkiem do dokumentacji 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 tych metod.
Testowanie procesów IDP obsługiwanych przez pakiet SDK Firebase
Jeśli Twoja aplikacja korzysta z pełnego procesu pakietu SDK Firebase, np. OAuthProvider
do logowania się w usługach Microsoft, GitHub czy Yahoo, możesz przetestować interaktywnie logowanie w aplikacji internetowej, która wywołuje metodę signinWithPopup
lub signInWithRedirect
. W tym celu emulator Authentication wyświetla lokalną wersję odpowiedniej strony logowania. 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 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 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 usług logowania Google, Apple i innych dostawców, które 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 nieinteraktywnego 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 stosować przepływ uwierzytelniania za pomocą tokenów z udawanymi tokenami identyfikatorów kont zamiast rzeczywistych danych logowania.
- 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.
- 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 uwierzytelnianie użytkownika z adresem e-mail foo@example.com
w Google. Potraktuj to pole jako klucz główny, 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ć.
Emulowane uwierzytelnianie za pomocą tokenu niestandardowego
Emulator Authentication obsługuje uwierzytelnianie za pomocą niestandardowych tokenów internetowych JSON, używając do tego metody signInWithCustomToken
na obsługiwanych platformach zgodnie z opisem w dokumentacji Authentication na potrzeby wersji produkcyjnej.
Różnice między emulatorem Authentication a wersją produkcyjną
Emulator Authentication Firebase symuluje wiele funkcji produkcyjnej wersji usługi. Ponieważ jednak każdy system uwierzytelniania opiera się na zabezpieczeniach na wielu poziomach (urządzenie, zewnętrzni dostawcy, Firebase itp.), emulatorowi trudno jest prawidłowo 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.
Logowanie się za pomocą linku w e-mailu na urządzeniu mobilnym
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 usługę zewnętrzną
W przypadku procesów logowania przez usługi zewnętrzne Firebase Authentication korzysta z bezpiecznych danych logowania od zewnętrznych dostawców, 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 wersjach produkcyjnych aplikacji procesy logowania się przez e-mail i SMS obejmują asynchroniczną operację, 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 wyświetla je w terminalu na potrzeby testowania.
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 odzwierciedla funkcji ograniczania szybkości ani funkcji zapobiegania nadużyciom w wersji produkcyjnej.
Funkcje blokowania
W wersji produkcyjnej użytkownicy są zapisywani w magazynie po wywołaniu zdarzeń beforeCreate
i beforeSignIn
. Ze względu na ograniczenia techniczne emulator Authentication zapisuje dane w magazynie dwukrotnie: raz po utworzeniu użytkownika i raz po zalogowaniu. Oznacza to, że w przypadku nowych użytkowników możesz wywołać funkcję getAuth().getUser()
w kontekście beforeSignIn
w emulatorze Authentication, ale w produkcji pojawi się błąd.
Co dalej?
Wyselekcjonowany zestaw filmów i szczegółowe instrukcje znajdziesz na playlistzie szkoleń na temat emulatorów Firebase.
Funkcja wywoływana jest typową integracją z Authentication. Dowiedz się więcej o emulatorze Cloud Functions for Firebase w artykule Wykonywanie funkcji lokalnie.