Możesz użyć uwierzytelniania Firebase, aby zalogować użytkownika, wysyłając wiadomość SMS na telefon użytkownika. Użytkownik loguje się za pomocą jednorazowego kodu zawartego w wiadomości SMS.
Najłatwiejszym sposobem dodania logowania za pomocą numeru telefonu do aplikacji jest użycie interfejsu FirebaseUI , który zawiera widżet logowania, który implementuje przepływy logowania do logowania za pomocą numeru telefonu, a także logowanie oparte na haśle i federacyjne -w. W tym dokumencie opisano, jak zaimplementować proces logowania za pomocą numeru telefonu przy użyciu pakietu SDK Firebase.
Zanim zaczniesz
Jeśli jeszcze tego nie zrobiłeś, skopiuj fragment kodu inicjującego z konsoli Firebase do swojego projektu zgodnie z opisem w Dodawanie Firebase do projektu JavaScript .Obawy dotyczące bezpieczeństwa
Uwierzytelnianie za pomocą samego numeru telefonu, choć wygodne, jest mniej bezpieczne niż inne dostępne metody, ponieważ posiadanie numeru telefonu można łatwo przenosić między użytkownikami. Ponadto na urządzeniach z wieloma profilami użytkowników każdy użytkownik, który może odbierać wiadomości SMS, może zalogować się na konto przy użyciu numeru telefonu urządzenia.
Jeśli korzystasz z logowania na podstawie numeru telefonu w swojej aplikacji, powinieneś oferować je wraz z bezpieczniejszymi metodami logowania i informować użytkowników o kompromisach związanych z używaniem logowania za pomocą numeru telefonu.
Włącz logowanie przy użyciu numeru telefonu do projektu Firebase
Aby logować użytkowników przez SMS, musisz najpierw włączyć metodę logowania na numer telefonu w swoim projekcie Firebase:
- W konsoli Firebase otwórz sekcję Uwierzytelnianie .
- Na stronie Metoda logowania włącz metodę logowania Numer telefonu .
- Na tej samej stronie dodaj swoją domenę, jeśli domena, w której będzie hostowana Twoja aplikacja, nie jest wymieniona w sekcji Domeny przekierowania OAuth .
Limit żądań logowania na numer telefonu w Firebase jest na tyle wysoki, że nie ma to wpływu na większość aplikacji. Jeśli jednak musisz zalogować bardzo dużą liczbę użytkowników za pomocą uwierzytelniania telefonicznego, może być konieczne uaktualnienie planu cenowego. Zobacz stronę z cenami .
Skonfiguruj weryfikator reCAPTCHA
Aby móc logować użytkowników przy użyciu ich numerów telefonów, musisz skonfigurować weryfikator Firebase reCAPTCHA. Firebase używa reCAPTCHA, aby zapobiegać nadużyciom, na przykład upewniając się, że prośba o weryfikację numeru telefonu pochodzi z jednej z dozwolonych domen Twojej aplikacji.
Nie musisz ręcznie konfigurować klienta reCAPTCHA; kiedy używasz obiektu RecaptchaVerifier
z pakietu SDK RecaptchaVerifier
, Firebase automatycznie tworzy i obsługuje wszelkie niezbędne klucze i wpisy tajne klienta.
Obiekt RecaptchaVerifier
obsługuje niewidoczne reCAPTCHA , które często mogą zweryfikować użytkownika bez konieczności podejmowania jakichkolwiek działań przez użytkownika, a także widżet reCAPTCHA, który zawsze wymaga interakcji użytkownika, aby zakończyć się pomyślnie.
Podstawowy renderowany reCAPTCHA można zlokalizować zgodnie z preferencjami użytkownika, aktualizując kod języka w wystąpieniu Auth przed renderowaniem reCAPTCHA. Powyższa lokalizacja będzie dotyczyć również wiadomości SMS wysyłanej do użytkownika, zawierającej kod weryfikacyjny.
Web v8
firebase.auth().languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // firebase.auth().useDeviceLanguage();
Web v9
import { getAuth } from "firebase/auth"; const auth = getAuth(); auth.languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // firebase.auth().useDeviceLanguage();
Użyj niewidocznego reCAPTCHA
Aby użyć niewidocznego reCAPTCHA, utwórz obiekt RecaptchaVerifier
z parametrem size
ustawionym na invisible
, określając identyfikator przycisku, który przesyła formularz logowania. Na przykład:
Web v8
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('sign-in-button', { 'size': 'invisible', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. onSignInSubmit(); } });
Web v9
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier('sign-in-button', { 'size': 'invisible', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. onSignInSubmit(); } }, auth);
Użyj widżetu reCAPTCHA
Aby użyć widocznego widżetu reCAPTCHA, utwórz element na swojej stronie, który będzie zawierał widżet, a następnie utwórz obiekt RecaptchaVerifier
, określając identyfikator kontenera, gdy to zrobisz. Na przykład:
Web v8
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container');
Web v9
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier('recaptcha-container', {}, auth);
Opcjonalnie: określ parametry reCAPTCHA
Możesz opcjonalnie ustawić funkcje zwrotne w obiekcie RecaptchaVerifier
które są wywoływane, gdy użytkownik rozwiązuje reCAPTCHA lub reCAPTCHA wygasa przed wysłaniem formularza:
Web v8
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container', { 'size': 'normal', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. // ... }, 'expired-callback': () => { // Response expired. Ask user to solve reCAPTCHA again. // ... } });
Web v9
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier('recaptcha-container', { 'size': 'normal', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. // ... }, 'expired-callback': () => { // Response expired. Ask user to solve reCAPTCHA again. // ... } }, auth);
Opcjonalnie: wyrenderuj wstępnie reCAPTCHA
Jeśli chcesz wstępnie wyrenderować reCAPTCHA przed przesłaniem żądania logowania, wywołaj render
:
Web v8
recaptchaVerifier.render().then((widgetId) => { window.recaptchaWidgetId = widgetId; });
Web v9
recaptchaVerifier.render().then((widgetId) => { window.recaptchaWidgetId = widgetId; });
Po zakończeniu render
otrzymasz identyfikator widżetu reCAPTCHA, którego możesz użyć do wywołania interfejsu API reCAPTCHA :
Web v8
const recaptchaResponse = grecaptcha.getResponse(recaptchaWidgetId);
Web v9
const recaptchaResponse = grecaptcha.getResponse(recaptchaWidgetId);
Wyślij kod weryfikacyjny na telefon użytkownika
Aby zainicjować logowanie za pomocą numeru telefonu, przedstaw użytkownikowi interfejs, który prosi o podanie numeru telefonu, a następnie zadzwoń do funkcji signInWithPhoneNumber
aby poprosić signInWithPhoneNumber
o wysłanie kodu uwierzytelniającego na telefon użytkownika za pomocą wiadomości SMS:
Uzyskaj numer telefonu użytkownika.
Wymagania prawne są różne, ale zgodnie z najlepszą praktyką i aby określić oczekiwania użytkowników, należy ich poinformować, że jeśli korzystają z logowania telefonicznego, mogą otrzymać wiadomość SMS do weryfikacji i zastosować standardowe stawki.
- Call
signInWithPhoneNumber
, przekazując do niego numer telefonu użytkownika i utworzony wcześniejRecaptchaVerifier
.JeśliWeb v8
const phoneNumber = getPhoneNumberFromUserInput(); const appVerifier = window.recaptchaVerifier; firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier) .then((confirmationResult) => { // SMS sent. Prompt user to type the code from the message, then sign the // user in with confirmationResult.confirm(code). window.confirmationResult = confirmationResult; // ... }).catch((error) => { // Error; SMS not sent // ... });
Web v9
import { getAuth, signInWithPhoneNumber } from "firebase/auth"; const phoneNumber = getPhoneNumberFromUserInput(); const appVerifier = window.recaptchaVerifier; const auth = getAuth(); signInWithPhoneNumber(auth, phoneNumber, appVerifier) .then((confirmationResult) => { // SMS sent. Prompt user to type the code from the message, then sign the // user in with confirmationResult.confirm(code). window.confirmationResult = confirmationResult; // ... }).catch((error) => { // Error; SMS not sent // ... });
signInWithPhoneNumber
skutkuje błędem, zresetuj reCAPTCHA, aby użytkownik mógł spróbować ponownie:grecaptcha.reset(window.recaptchaWidgetId); // Or, if you haven't stored the widget ID: window.recaptchaVerifier.render().then(function(widgetId) { grecaptcha.reset(widgetId); }
Metoda signInWithPhoneNumber
reCAPTCHA do użytkownika, a jeśli użytkownik przejdzie wyzwanie, żąda, aby funkcja uwierzytelniania Firebase wysłała wiadomość SMS zawierającą kod weryfikacyjny na telefon użytkownika.
Zaloguj użytkownika za pomocą kodu weryfikacyjnego
Po signInWithPhoneNumber
wywołaniu funkcji signInWithPhoneNumber
użytkownika o wpisanie kodu weryfikacyjnego otrzymanego w wiadomości SMS. Następnie zaloguj się użytkownika, przekazując kod do metody confirm
obiektu ConfirmationResult
która została przekazana do signInWithPhoneNumber
obsługi realizacji signInWithPhoneNumber
(czyli jego bloku then
). Na przykład:
Web v8
const code = getCodeFromUserInput(); confirmationResult.confirm(code).then((result) => { // User signed in successfully. const user = result.user; // ... }).catch((error) => { // User couldn't sign in (bad verification code?) // ... });
Web v9
const code = getCodeFromUserInput(); confirmationResult.confirm(code).then((result) => { // User signed in successfully. const user = result.user; // ... }).catch((error) => { // User couldn't sign in (bad verification code?) // ... });
Jeśli połączenie w celu confirm
powiodło się, użytkownik został pomyślnie zalogowany.
Pobierz pośredni obiekt AuthCredential
Jeśli chcesz uzyskać obiekt AuthCredential
dla konta użytkownika, przekaż kod weryfikacyjny z wyniku potwierdzenia i kod weryfikacyjny do PhoneAuthProvider.credential
zamiast dzwonić do confirm
:
var credential = firebase.auth.PhoneAuthProvider.credential(confirmationResult.verificationId, code);
Następnie możesz zalogować użytkownika przy użyciu poświadczeń:
firebase.auth().signInWithCredential(credential);
Testuj z fikcyjnymi numerami telefonów
W konsoli Firebase możesz skonfigurować fikcyjne numery telefonów do programowania. Testowanie z fikcyjnymi numerami telefonów zapewnia następujące korzyści:
- Przetestuj uwierzytelnianie numeru telefonu bez zużywania limitu użytkowania.
- Przetestuj uwierzytelnianie numeru telefonu bez wysyłania faktycznej wiadomości SMS.
- Uruchom kolejne testy z tym samym numerem telefonu bez dławienia. Minimalizuje to ryzyko odrzucenia podczas procesu przeglądu App Store, jeśli recenzent użyje tego samego numeru telefonu do testów.
- Testuj z łatwością w środowiskach programistycznych bez dodatkowego wysiłku, takiego jak możliwość tworzenia w symulatorze iOS lub emulatorze Androida bez usług Google Play.
- Pisz testy integracyjne bez blokowania przez kontrole bezpieczeństwa zwykle stosowane na rzeczywistych numerach telefonów w środowisku produkcyjnym.
Fikcyjne numery telefonów muszą spełniać te wymagania:
- Upewnij się, że używasz numerów telefonów, które są rzeczywiście fikcyjne i jeszcze nie istnieją. Uwierzytelnianie Firebase nie pozwala ustawić istniejących numerów telefonów używanych przez rzeczywistych użytkowników jako numerów testowych. Jedną z opcji jest użycie 555 numerów z prefiksem jako numerów testowych w USA, na przykład: +1 650-555-3434
- Numery telefonów muszą być poprawnie sformatowane pod względem długości i innych ograniczeń. Będą nadal przechodzić tę samą weryfikację, co numer telefonu rzeczywistego użytkownika.
- Możesz dodać do 10 numerów telefonów do programowania.
- Używaj testowych numerów / kodów telefonów, które są trudne do odgadnięcia i często je zmieniaj.
Twórz fikcyjne numery telefonów i kody weryfikacyjne
- W konsoli Firebase otwórz sekcję Uwierzytelnianie .
- Na karcie Metoda logowania włącz dostawcę telefonu, jeśli jeszcze tego nie zrobiłeś.
- Otwórz menu Numery telefonów do testowania akordeonu.
- Podaj numer telefonu, który chcesz przetestować, na przykład: +1 650-555-3434 .
- Podaj 6-cyfrowy kod weryfikacyjny dla tego konkretnego numeru, na przykład: 654321 .
- Dodaj numer. W razie potrzeby możesz usunąć numer telefonu i jego kod, najeżdżając kursorem na odpowiedni wiersz i klikając ikonę kosza.
Testowanie ręczne
Możesz bezpośrednio zacząć używać fikcyjnego numeru telefonu w swojej aplikacji. Pozwala to na wykonywanie ręcznych testów na etapach programowania bez problemów z przydziałami lub ograniczania przepustowości. Możesz także testować bezpośrednio z symulatora iOS lub emulatora Androida bez zainstalowanych usług Google Play.
Gdy podasz fikcyjny numer telefonu i wyślesz kod weryfikacyjny, SMS nie zostanie wysłany. Zamiast tego musisz podać wcześniej skonfigurowany kod weryfikacyjny, aby ukończyć logowanie.
Po zakończeniu logowania zostaje utworzony użytkownik Firebase z tym numerem telefonu. Użytkownik ma takie samo zachowanie i właściwości, jak prawdziwy użytkownik numeru telefonu i może uzyskać dostęp do bazy danych czasu rzeczywistego / Cloud Firestore i innych usług w ten sam sposób. Identyfikator wybity podczas tego procesu ma taki sam podpis jak prawdziwy użytkownik numeru telefonu.
Inną opcją jest ustawienie roli testowej za pomocą niestandardowych oświadczeń dla tych użytkowników, aby odróżnić ich jako fałszywych użytkowników, jeśli chcesz dodatkowo ograniczyć dostęp.
Testy integracyjne
Oprócz testów ręcznych Uwierzytelnianie Firebase udostępnia interfejsy API ułatwiające pisanie testów integracyjnych na potrzeby testów uwierzytelniania przez telefon. Te interfejsy API wyłączają weryfikację aplikacji, wyłączając wymaganie reCAPTCHA w sieci i ciche powiadomienia push w iOS. Dzięki temu testowanie automatyzacji jest możliwe w tych przepływach i jest łatwiejsze do wdrożenia. Ponadto pomagają zapewnić możliwość testowania przepływów natychmiastowej weryfikacji w systemie Android.
W internecie ustaw appVerificationDisabledForTesting
na true
przed renderowaniem firebase.auth.RecaptchaVerifier
. Spowoduje to automatyczne rozwiązanie problemu z reCAPTCHA, umożliwiając przekazanie numeru telefonu bez ręcznego rozwiązywania tego problemu. Pamiętaj, że nawet jeśli reCAPTCHA jest wyłączone, logowanie nie jest możliwe przy użyciu niefikcyjnego numeru telefonu. W tym interfejsie API można używać tylko fikcyjnych numerów telefonów.
// Turn off phone auth app verification. firebase.auth().settings.appVerificationDisabledForTesting = true; var phoneNumber = "+16505554567"; var testVerificationCode = "123456"; // This will render a fake reCAPTCHA as appVerificationDisabledForTesting is true. // This will resolve after rendering without app verification. var appVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container'); // signInWithPhoneNumber will call appVerifier.verify() which will resolve with a fake // reCAPTCHA response. firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier) .then(function (confirmationResult) { // confirmationResult can resolve with the fictional testVerificationCode above. return confirmationResult.confirm(testVerificationCode) }).catch(function (error) { // Error; SMS not sent // ... });
Widoczne i niewidoczne pozorowane weryfikatory aplikacji reCAPTCHA zachowują się inaczej, gdy weryfikacja aplikacji jest wyłączona:
- Widoczne reCAPTCHA : Kiedy widoczne reCAPTCHA jest renderowane przez
appVerifier.render()
, automatycznie rozwiązuje się po ułamku sekundy. Jest to równoważne kliknięciu przez użytkownika reCAPTCHA natychmiast po renderowaniu. Odpowiedź reCAPTCHA wygaśnie po pewnym czasie i zostanie ponownie automatycznie rozwiązana. - Niewidoczne reCAPTCHA : Niewidoczne reCAPTCHA nie są automatycznie rozwiązywane podczas renderowania, a zamiast tego robi to w
appVerifier.verify()
lub po kliknięciu kotwicy przycisku reCAPTCHA po ułamku sekundy. Podobnie, odpowiedź wygaśnie po pewnym czasie i zostanie rozwiązana automatycznie tylko poappVerifier.verify()
lub po ponownym kliknięciu kotwicy przycisku reCAPTCHA.
Za każdym razem, gdy próbna reCAPTCHA zostanie rozwiązana, odpowiednia funkcja wywołania zwrotnego jest wyzwalana zgodnie z oczekiwaniami z fałszywą odpowiedzią. Jeśli określono również wywołanie zwrotne wygaśnięcia, zostanie ono uruchomione po wygaśnięciu.
Następne kroki
Gdy użytkownik loguje się po raz pierwszy, tworzone jest nowe konto użytkownika i jest ono łączone z poświadczeniami - czyli nazwą użytkownika i hasłem, numerem telefonu lub informacjami dostawcy uwierzytelniania - zalogowanym użytkownikiem. To nowe konto jest przechowywane jako część projektu Firebase i może służyć do identyfikacji użytkownika we wszystkich aplikacjach w Twoim projekcie, niezależnie od tego, w jaki sposób się on zaloguje.
W aplikacjach zalecanym sposobem poznania statusu
Auth
użytkownika jest ustawienie obserwatora na obiekcieAuth
. Następnie możesz uzyskać podstawowe informacje o profiluUser
obiektuUser
. Zobacz Zarządzanie użytkownikami .W Firebase Realtime Database i Cloud Storage Rules możesz uzyskać unikalny identyfikator zalogowanego użytkownika ze zmiennej
auth
i używać go do kontrolowania, do jakich danych użytkownik ma dostęp.
Możesz zezwolić użytkownikom na logowanie się do aplikacji przy użyciu wielu dostawców uwierzytelniania, łącząc poświadczenia dostawcy uwierzytelniania z istniejącym kontem użytkownika.
Aby wylogować użytkownika, wywołaj signOut
:
Web v8
firebase.auth().signOut().then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });
Web v9
import { getAuth, signOut } from "firebase/auth"; const auth = getAuth(); signOut(auth).then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });