Łączenie aplikacji z emulatorem uwierzytelniania

Zanim użyjesz emulatora uwierzytelniania w swojej aplikacji, upewnij się, że rozumiesz cały przepływ pracy w Pakiecie emulatorów lokalnych Firebase oraz że zainstalujesz i skonfigurujesz Pakiet emulatorów lokalnych, a także zapoznasz się z poleceniami interfejsu wiersza poleceń.

Zakładamy w nim, że wiesz już, jak tworzyć rozwiązania do uwierzytelniania Firebase w środowisku produkcyjnym. W razie potrzeby zapoznaj się z dokumentacją dotyczącą połączenia platformy i metody uwierzytelniania.

Co mogę zrobić przy użyciu emulatora uwierzytelniania?

Emulator uwierzytelniania pozwala na wysokiej jakości lokalną emulację usług uwierzytelniania Firebase i oferuje większość funkcji dostępnych w produkcyjnym Uwierzytelnianiu Firebase. Emulator w połączeniu z platformami Apple oraz pakietami SDK na Androida i internetowe Firebase pozwala:

  • 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.

Wybierz projekt Firebase

Pakiet emulatorów lokalnych Firebase emuluje usługi związane z jednym projektem Firebase.

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

Pakiet emulatorów lokalnych obsługuje emulację prawdziwych projektów Firebase i projektów prezentacyjnych.

Typ projektu Funkcje Używanie z emulatorami
Prawdziwe

Prawdziwy projekt Firebase to projekt utworzony i skonfigurowany przez Ciebie (najprawdopodobniej w konsoli Firebase).

Rzeczywiste projekty mają aktywne zasoby, takie jak instancje bazy danych, zasobniki na dane, funkcje lub inne zasoby skonfigurowane dla danego projektu 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ą wchodzić w interakcje z aktywnym zasobem (instancją bazy danych, zasobnikiem na dane, funkcją itp.).

Demonstracyjny

Projekt demonstracyjny Firebase nie ma rzeczywistej konfiguracji Firebase ani aktywnych zasobów. 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.
  • Silniejsze bezpieczeństwo, ponieważ jeśli Twój kod przypadkowo wywoła zasoby nieemulowane (produkcyjne), nie ma szans na zmianę danych, ich wykorzystanie i płatności
  • Lepsza obsługa offline, ponieważ nie musisz łączyć się z internetem, aby pobrać konfigurację pakietu SDK.

Dostosuj aplikację, aby komunikować się z emulatorem

Pakiety SDK na Androida, iOS i aplikacje internetowe

Skonfiguruj konfigurację w aplikacji lub klasy testowe, aby korzystać z emulatora uwierzytelniania w podany niżej 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");

Do tworzenia prototypów i testowania interakcji między Uwierzytelnianiem a funkcjami w Cloud Functions lub regułami zabezpieczeń Firebase w Cloud Firestore lub Bazie danych czasu rzeczywistego nie jest wymagana dodatkowa konfiguracja. Gdy emulator uwierzytelniania jest skonfigurowany, a inne są uruchomione, automatycznie ze sobą współpracują.

Pakiety Admin SDK

Pakiety Firebase Admin SDK automatycznie łączą się z emulatorem uwierzytelniania po ustawieniu zmiennej środowiskowej FIREBASE_AUTH_EMULATOR_HOST.

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

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

Po ustawieniu zmiennej środowiskowej pakiety SDK Firebase Admin będą akceptować niepodpisane tokeny identyfikatorów i pliki cookie sesji wysyłane przez emulator uwierzytelniania (odpowiednio za pomocą metod verifyIdToken i createSessionCookie), aby ułatwić lokalne programowanie i testowanie. Pamiętaj, by nie ustawiać zmiennej środowiskowej w środowisku produkcyjnym.

Jeśli chcesz, by Twój kod pakietu Admin SDK łączył się ze współdzielonym emulatorem działającym w innym środowisku, musisz podać ten sam identyfikator projektu, który ustawiasz w interfejsie wiersza poleceń Firebase. Identyfikator projektu możesz przekazać bezpośrednio do usługi 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 identyfikatorów

Ze względów bezpieczeństwa emulator uwierzytelniania generuje niepodpisane tokeny identyfikatorów, które są akceptowane tylko przez inne emulatory Firebase, lub przez konfigurowany pakiet SDK Firebase Admin. Te tokeny zostaną odrzucone przez usługi produkcyjne Firebase lub pakiet SDK Firebase Admin w trybie produkcyjnym (np. domyślne działanie bez czynności konfiguracyjnych opisanych powyżej).

Uruchom emulator

Z emulatora uwierzytelniania możesz korzystać interaktywnie w interfejsie Pakietu emulatorów, a w sposób nieinteraktywny – przez lokalny interfejs REST. W sekcjach poniżej omawiamy 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 aplikacja może używać funkcji logowania się dla Twojej platformy (iOS, Android, sieć).

W przypadku uwierzytelniania przez e-maila i hasło możesz zacząć prototypowanie, dodając konta użytkowników do emulatora uwierzytelniania z poziomu aplikacji przy użyciu metod pakietu Authentication SDK lub interfejsu pakietu emulatorów.

  1. W interfejsie pakietu emulatorów kliknij kartę Authentication (Uwierzytelnianie).
  2. Kliknij przycisk Dodaj użytkownika.
  3. Postępuj zgodnie z instrukcjami tworzenia konta użytkownika i wypełnij pola uwierzytelniania poczty e-mail.

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

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 przeprowadzić symulację zdarzenia weryfikacji i sprawdzić, 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 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 użytkownika pakietu emulatorów lub kodu klienta do zarządzania kontami użytkowników z adresami e-mail i hasłami, możesz napisać skrypty konfiguracji testów, które wywołują interfejsy API REST do tworzenia i usuwania kont użytkowników oraz pobierają zewnętrzne kody weryfikacyjne w celu wypełnienia adresu URL do weryfikacji adresu e-mail emulatora. Pozwala to oddzielić platformę od kodu testowego i umożliwia przeprowadzanie testów 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ą punktu końcowego rejestracji REST uwierzytelniania.
  2. Loguj użytkowników przy użyciu adresów e-mail i haseł w celu przeprowadzenia testów.
  3. W razie potrzeby pobierz dostępne kody weryfikacyjne poczty e-mail spoza zakresu z punktu końcowego REST emulatora.
  4. Usuń rekordy użytkownika z punktem końcowym REST specyficznym dla emulatora, aby wyczyścić dane.

Emulowane uwierzytelnianie przez telefon/SMS-y

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

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

W przypadku kodu klienta proces uwierzytelniania przez telefon/SMS jest taki sam jak proces produkcyjny (iOS, Android, sieć).

Korzystanie z interfejsu użytkownika Pakietu emulatorów:

  1. W interfejsie pakietu emulatorów kliknij kartę Authentication (Uwierzytelnianie).
  2. Kliknij przycisk Dodaj użytkownika.
  3. Postępuj zgodnie z instrukcjami tworzenia konta użytkownika i wypełnij pola uwierzytelniania przez telefon.

Jednak w przypadku uwierzytelniania przez telefon emulator NIE aktywuje dostarczania żadnych SMS-ów, ponieważ kontakt z operatorem wykracza poza zakres i nie jest odpowiedni do lokalnych testów. 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

Do nieinteraktywnego testowania uwierzytelniania przez telefon możesz pobrać dostępne kody SMS za pomocą emulatora uwierzytelniania REST API. Pamiętaj, że przy każdym inicjowaniu procesu kod jest inny.

Typowa sekwencja wygląda tak.

  1. Zadzwoń na platformę signInWithPhoneNumber, aby rozpocząć proces weryfikacji.
  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 uwierzytelniania obsługuje prototypowanie i testowanie procesów uwierzytelniania wielopoziomowego SMS (MFA) dostępnych w środowisku produkcyjnym na iOS, Androida i w przeglądarce.

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 są wysyłane do tego samego terminala, na którym uruchomiono interfejs firebase emulators:start, i są dostępne z poziomu interfejsu REST.

Emulacja uwierzytelniania zewnętrznego dostawcy tożsamości

Emulator uwierzytelniania umożliwia testowanie wielu procesów uwierzytelniania innych firm w aplikacjach na iOS, Androida i aplikacji internetowych bez konieczności wprowadzania zmian w kodzie produkcyjnym. Przykłady przepływów uwierzytelniania znajdziesz w dokumentacji różnych kombinacji dostawców i platform, których możesz używać w aplikacji.

Ogólnie za pomocą pakietu SDK Firebase możesz uwierzytelniać się na jeden z dwóch sposobów:

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

Ponownie wróć do linku do dokumentacji i upewnij się, że znasz ten proces – zarządzany przez pakiet SDK Firebase lub samodzielne pobieranie danych logowania, którego chcesz używać. Emulator uwierzytelniania obsługuje testowanie obu metod.

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

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 uwierzytelniania wyświetli lokalną wersję odpowiedniej strony logowania, aby ułatwić Ci przetestowanie uwierzytelniania z aplikacji internetowych, które wywołują metodę signinWithPopup lub signInWithRedirect. Wyświetlana lokalnie strona logowania pojawia się też w aplikacjach mobilnych, renderowana przez bibliotekę WebView Twojej platformy.

W miarę postępów emulator tworzy imitacje zewnętrznych kont użytkowników i danych logowania.

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

Jeśli użyjesz technik logowania „ręcznego” i wywołasz metodę signInWithCredentials Twojej platformy, aplikacja jak zwykle poprosi o zalogowanie się przez aplikację zewnętrzną i będzie pobierać prawdziwe dane logowania innej firmy.

Pamiętaj, że emulator obsługuje uwierzytelnianie signInWithCredential tylko w przypadku danych logowania pobieranych za pomocą Logowania przez Google, Apple i innych dostawców, którzy korzystają z tokenów tożsamości zaimplementowanych jako tokeny internetowe JSON (JWT). Tokeny dostępu (np. te udostępnione przez Facebooka lub Twittera, które nie są tokenami JWT) nie są obsługiwane. W następnej sekcji omawiamy alternatywy w takich przypadkach.

Testy nieinteraktywne

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

Możesz też zaktualizować swój kod tak, aby używał signInWithCredential (np. w gałęzi kodu) i użyć procesu uwierzytelniania tokenem z imitacją tokenów tożsamości dla kont zamiast prawdziwych danych logowania.

  1. Ponownie lub skomentuj fragment kodu, który pobiera tokeny idToken od dostawcy tożsamości. Dzięki temu podczas testów nie trzeba już podawać prawdziwych nazw użytkowników i haseł, a testy nie muszą się już pokrywać z limitami interfejsów API ani szybkości u dostawców tożsamości.
  2. Po drugie użyj literału JSON zamiast tokena dla signInWithCredential. Korzystając z przykładowego pakietu SDK, możesz zmienić kod na:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

Ten kod użyty z emulatorem pozwala uwierzytelnić użytkownika za pomocą adresu e-mail foo@example.com w Google. Potraktuj pole podrzędne jako klucz podstawowy, który można zmienić w dowolny ciąg znaków, naśladując logowanie się różnych użytkowników. Możesz zastąpić firebase.auth.GoogleAuthProvider na przykład new firebase.auth.OAuthProvider('yahoo.com') lub innym identyfikatorem dostawcy, który chcesz symulować.

Emulowane uwierzytelnianie tokenem niestandardowym

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

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

Emulator uwierzytelniania Firebase symuluje wiele funkcji usługi produkcyjnej. 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 replikować ani nie przestrzegać żadnych działań związanych z uprawnieniami dotyczącymi uruchamiania. Emulatory przestrzegają podanych reguł zabezpieczeń Firebase, ale w sytuacjach, w których uprawnienia są zwykle używane, np. do skonfigurowania konta usługi Cloud Functions, a zatem uprawnień, emulatora nie można skonfigurować i używa on konta dostępnego globalnie na komputerze dewelopera, podobnie jak w przypadku bezpośredniego uruchomienia skryptu lokalnego.

Ponieważ na platformach mobilnych logowanie się za pomocą linków w e-mailach korzysta z Linków dynamicznych Firebase, wszystkie takie linki będą otwierane na platformie internetowej na urządzeniach mobilnych.

Logowanie przez inną usługę

W przypadku procesów logowania z usług innych firm Uwierzytelnianie Firebase korzysta z bezpiecznych danych logowania od dostawców zewnętrznych, takich jak Twitter czy GitHub.

Emulator uwierzytelniania akceptuje prawdziwe dane uwierzytelniające dostawców OpenID Connect, takich jak Google czy Apple. Dane logowania dostawców niekorzystających z OpenID Connect nie są obsługiwane.

Logowanie się 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 uwierzytelniania nie wysyła żadnych e-maili ani SMS-ów, ale zgodnie z opisem powyżej generuje kody logowania i wysyła je do terminala do użycia podczas testów.

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

Uwierzytelnianie tokenem niestandardowym

Emulator uwierzytelniania nie weryfikuje podpisu ani wygaśnięcia tokenów niestandardowych. Dzięki temu w scenariuszach tworzenia i testowania można używać ręcznie przygotowanych tokenów i używać ich w nieskończoność.

Ograniczanie liczby żądań / przeciwdziałanie nadużyciom

Emulator uwierzytelniania nie powiela funkcji ograniczających częstotliwość produkcji ani funkcji zapobiegających nadużyciom.

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 uwierzytelniania 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ć getAuth().getUser() w emulatorze uwierzytelniania beforeSignIn, ale w środowisku produkcyjnym wystąpi błąd.

Co dalej?