Uwierzytelniaj w Firebase na urządzeniu z Androidem przy użyciu numeru telefonu

Możesz używać uwierzytelniania Firebase do logowania użytkownika, wysyłając SMS-a na jego telefon. Użytkownik loguje się za pomocą jednorazowego kodu zawartego w wiadomości SMS.

Najprostszym sposobem dodania do aplikacji funkcji logowania przy użyciu numeru telefonu jest użycie w aplikacji FirebaseUI, która zawiera widżet logowania, który implementuje procesy logowania za pomocą numeru telefonu, a także logowania opartego na haśle i sfederowanego logowania. W tym dokumencie opisujemy, jak za pomocą pakietu SDK Firebase wdrożyć proces logowania się numerem telefonu.

Zanim zaczniesz

  1. Dodaj Firebase do swojego projektu Android, chyba że masz to już za sobą.
  2. W pliku Gradle modułu (na poziomie aplikacji) (zwykle <project>/<app-module>/build.gradle.kts lub <project>/<app-module>/build.gradle) dodaj zależność z biblioteką uwierzytelniania Firebase na Androida. Do kontrolowania obsługi wersji biblioteki zalecamy używanie funkcji Firebase Android BoM.
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.1.1"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }
    

    Dzięki użyciu BoM Firebase Android BoM Twoja aplikacja zawsze używa zgodnych wersji bibliotek Firebase na Androida.

    (Alternatywnie) Dodawanie zależności bibliotek Firebase bez korzystania z BM

    Jeśli nie chcesz używać Firebase BoM, musisz określić każdą wersję biblioteki Firebase w wierszu zależności.

    Pamiętaj, że jeśli w swojej aplikacji używasz wielu bibliotek Firebase, zdecydowanie zalecamy korzystanie z BoM do zarządzania wersjami bibliotek. Dzięki temu będziesz mieć pewność, że wszystkie wersje są zgodne.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:23.0.0")
    }
    
    Szukasz modułu biblioteki korzystającego z usługi Kotlin? Od października 2023 r. (Firebase BoM 32.5.0) zarówno deweloperzy aplikacji Kotlin, jak i języki Java mogą korzystać z modułu biblioteki głównej (więcej informacji znajdziesz w odpowiedziach na najczęstsze pytania o tę inicjatywę).
  3. Jeśli Twoja aplikacja nie jest jeszcze połączona z projektem Firebase, możesz to zrobić z poziomu konsoli Firebase.
  4. Jeśli nie masz jeszcze ustawionego skrótu SHA-1 swojej aplikacji w konsoli Firebase, zrób to. Informacje o tym, jak znaleźć hasz SHA-1 Twojej aplikacji, znajdziesz w artykule Uwierzytelnianie klienta.

Potencjalne problemy z bezpieczeństwem

Uwierzytelnianie przy użyciu numeru telefonu, choć jest wygodne, jest mniej bezpieczne niż inne dostępne metody, ponieważ posiadanie numeru telefonu można łatwo przenieść między użytkownikami. Ponadto na urządzeniach z wieloma profilami użytkownika każdy użytkownik, który może odbierać SMS-y, może zalogować się na konto przy użyciu numeru telefonu tego urządzenia.

Jeśli w swojej aplikacji korzystasz z logowania się na podstawie numeru telefonu, zaoferuj je wraz z bezpieczniejszymi metodami logowania i poinformuj użytkowników o problemach związanych z bezpieczeństwem logowania się przy użyciu numeru telefonu.

Włączanie logowania się za pomocą numeru telefonu w projekcie Firebase

Aby logować użytkowników SMS-em, musisz najpierw włączyć w projekcie Firebase metodę logowania z numerem telefonu:

  1. W konsoli Firebase otwórz sekcję Uwierzytelnianie.
  2. Na stronie Metoda logowania włącz metodę logowania Numer telefonu.

Limit próśb Firebase o zalogowanie się za pomocą numeru telefonu jest tak wysoki, że nie będzie to miało wpływu na większość aplikacji. Jeśli jednak musisz zalogować bardzo dużą liczbę użytkowników z wykorzystaniem uwierzytelniania przez telefon, konieczne może być przejście na wyższy abonament. Zobacz stronę z cenami.

Włącz weryfikację aplikacji

Aby używać uwierzytelniania przez numer telefonu, Firebase musi mieć możliwość weryfikacji, czy żądania logowania na numer telefonu pochodzą z Twojej aplikacji. Uwierzytelnianie Firebase umożliwia to na 3 sposoby:

  • Play Integrity API: jeśli użytkownik ma urządzenie z zainstalowanymi Usługami Google Play, a Uwierzytelnianie Firebase może zweryfikować to urządzenie za pomocą interfejsu Play Integrity API, można zalogować się przy użyciu numeru telefonu. Interfejs Play Integrity API jest włączony w projekcie należącym do Google przez Uwierzytelnianie Firebase, a nie w Twoim projekcie. Nie wpływa to na limity Play Integrity API w projekcie. Pomoc Play Integrity jest dostępna z pakietem SDK uwierzytelniania w wersji 21.2.0 lub nowszej (Firebase BoM w wersji 31.4.0 lub nowszej).

    Jeśli nie masz jeszcze podanego odcisku cyfrowego SHA-256 swojej aplikacji, możesz to zrobić w ustawieniach projektu w konsoli Firebase, aby korzystać z Play Integrity. Szczegółowe informacje o pobieraniu odcisku cyfrowego SHA-256 aplikacji znajdziesz w artykule Uwierzytelnianie klienta.

  • Weryfikacja reCAPTCHA: jeśli nie można korzystać z Play Integrity, na przykład gdy użytkownik ma urządzenie bez zainstalowanych Usług Google Play, Uwierzytelnianie Firebase używa weryfikacji reCAPTCHA do ukończenia procesu logowania telefonicznego. Zadanie reCAPTCHA często można wykonać bez konieczności rozwiązywania żadnych problemów przez użytkownika. Pamiętaj, że ten proces wymaga powiązania z aplikacją SHA-1. Ten proces wymaga też, aby klucz interfejsu API nie miał ograniczeń lub był na liście dozwolonych dla PROJECT_ID.firebaseapp.com.

    Oto przykładowe sytuacje, w których reCAPTCHA jest uruchamiany:

    • Jeśli na urządzeniu użytkownika nie ma zainstalowanych Usług Google Play.
    • Jeśli aplikacja nie jest rozpowszechniana w Sklepie Google Play (w przypadku pakietu Authentication SDK w wersji 21.2.0 lub nowszej).
    • Jeśli uzyskany token SafetyNet był nieprawidłowy (w pakiecie SDK do uwierzytelniania w wersji < 21.2.0),

    Jeśli do weryfikacji aplikacji używana jest usługa SafetyNet lub Play Integrity, pole %APP_NAME% w szablonie SMS jest zapełniane nazwą aplikacji określoną ze Sklepu Google Play. W sytuacjach, gdy reCAPTCHA jest uruchamiany, pole %APP_NAME% jest zapełniane wartością PROJECT_ID.firebaseapp.com.

Proces weryfikacji reCAPTCHA możesz wymusić za pomocą operatora forceRecaptchaFlowForTesting. Weryfikację aplikacji możesz wyłączyć (jeśli używasz fikcyjnych numerów telefonów) za pomocą funkcji setAppVerificationDisabledForTesting.

Rozwiązywanie problemów

  • Błąd „Brak stanu początkowego” podczas korzystania z reCAPTCHA do weryfikacji aplikacji

    Ten błąd może wystąpić, gdy przepływ reCAPTCHA zostanie ukończony, ale użytkownik nie przekieruje użytkownika z powrotem do aplikacji natywnej. W takim przypadku użytkownik zostanie przekierowany na zastępczy adres URL PROJECT_ID.firebaseapp.com/__/auth/handler. W przeglądarkach Firefox otwieranie linków do aplikacji natywnych jest domyślnie wyłączone. Jeśli ten błąd pojawia się w Firefoksie, wykonaj czynności opisane w artykule Ustawianie przeglądarki Firefox na Androida do otwierania linków w aplikacjach natywnych, aby umożliwić otwieranie linków do aplikacji.

Wysyłanie kodu weryfikacyjnego na telefon użytkownika

Aby inicjować logowanie się za pomocą numeru telefonu, użyj interfejsu, który zachęca do wpisania numeru telefonu. Wymagania prawne są różne, ale zgodnie ze sprawdzoną metodą oraz ustaleniem oczekiwań użytkowników należy poinformować ich, że jeśli logują się przez telefon, mogą otrzymać SMS-a w celu weryfikacji. Obowiązują opłaty standardowe.

Następnie przekaż jego numer telefonu do metody PhoneAuthProvider.verifyPhoneNumber, aby poprosić Firebase o zweryfikowanie numeru telefonu użytkownika. Przykład:

Kotlin+KTX

val options = PhoneAuthOptions.newBuilder(auth)
    .setPhoneNumber(phoneNumber) // Phone number to verify
    .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
    .setActivity(this) // Activity (for callback binding)
    .setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Java

PhoneAuthOptions options = 
  PhoneAuthOptions.newBuilder(mAuth) 
      .setPhoneNumber(phoneNumber)       // Phone number to verify
      .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
      .setActivity(this)                 // (optional) Activity for callback binding
      // If no activity is passed, reCAPTCHA verification can not be used.
      .setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
      .build();
  PhoneAuthProvider.verifyPhoneNumber(options);     

Metoda verifyPhoneNumber jest wielokrotnie wywoływana: jeśli zostanie wywołana kilka razy, na przykład w metodzie onStart aktywności, metoda verifyPhoneNumber nie wyśle drugiego SMS-a, chyba że upłynie limit czasu pierwotnego żądania.

Możesz użyć tego działania, aby wznowić proces logowania się przy użyciu numeru telefonu, jeśli aplikacja zostanie zamknięta, zanim użytkownik będzie mógł się zalogować (np. gdy korzysta z aplikacji do obsługi SMS-ów). Po wywołaniu numeru verifyPhoneNumber ustaw flagę, że trwa weryfikacja. Następnie zapisz flagę w metodzie onSaveInstanceState aktywności i przywróć ją w onRestoreInstanceState. Na koniec w metodzie onStart w aktywności sprawdź, czy weryfikacja jest już w toku. Jeśli tak, ponownie wywołaj metodę verifyPhoneNumber. Usuń flagę po zakończeniu lub niepowodzeniu weryfikacji (patrz Wywołania zwrotne weryfikacyjne).

Aby łatwo obsługiwać obrót ekranu i inne przypadki ponownego uruchamiania się aktywności, przekaż swoją aktywność do metody verifyPhoneNumber. Wywołania zwrotne są automatycznie odłączane po zakończeniu działania, dzięki czemu możesz swobodnie pisać kod przejścia interfejsu użytkownika w metodach wywołania zwrotnego.

SMS wysłany przez Firebase można też zlokalizować, określając język uwierzytelniania za pomocą metody setLanguageCode w instancji Auth.

Kotlin+KTX

auth.setLanguageCode("fr")
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage()

Java

auth.setLanguageCode("fr");
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage();

Przy wywołaniu funkcji PhoneAuthProvider.verifyPhoneNumber musisz też podać instancję OnVerificationStateChangedCallbacks, która zawiera implementacje funkcji wywołania zwrotnego, które obsługują wyniki żądania. Przykład:

Kotlin+KTX

callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    override fun onVerificationCompleted(credential: PhoneAuthCredential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:$credential")
        signInWithPhoneAuthCredential(credential)
    }

    override fun onVerificationFailed(e: FirebaseException) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e)

        if (e is FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e is FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e is FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    override fun onCodeSent(
        verificationId: String,
        token: PhoneAuthProvider.ForceResendingToken,
    ) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:$verificationId")

        // Save verification ID and resending token so we can use them later
        storedVerificationId = verificationId
        resendToken = token
    }
}

Java

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:" + credential);

        signInWithPhoneAuthCredential(credential);
    }

    @Override
    public void onVerificationFailed(@NonNull FirebaseException e) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e);

        if (e instanceof FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e instanceof FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e instanceof FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    @Override
    public void onCodeSent(@NonNull String verificationId,
                           @NonNull PhoneAuthProvider.ForceResendingToken token) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mVerificationId = verificationId;
        mResendToken = token;
    }
};

Wywołania zwrotne w ramach weryfikacji

W większości aplikacji implementujesz wywołania zwrotne onVerificationCompleted, onVerificationFailed i onCodeSent. W zależności od wymagań aplikacji możesz też zastosować onCodeAutoRetrievalTimeOut.

onWeryfikacjaZakończona(PhoneAuthCredential)

Metodę tę wywołuje się w 2 sytuacjach:

  • Natychmiastowa weryfikacja: w niektórych przypadkach numer telefonu można zweryfikować od razu bez konieczności wysyłania czy wpisywania kodu weryfikacyjnego.
  • Automatyczne pobieranie: na niektórych urządzeniach Usługi Google Play mogą automatycznie wykrywać przychodzącego SMS-a weryfikacyjnego i przeprowadzać weryfikację bez działania ze strony użytkownika. (Ta funkcja może być niedostępna u niektórych operatorów). Jest to SMS retriever API, który zawiera 11-znakowy hasz na końcu SMS-a.
W obu przypadkach numer telefonu użytkownika został zweryfikowany. Do zalogowania użytkownika możesz użyć obiektu PhoneAuthCredential przekazywanego do wywołania zwrotnego.

onWeryfikacja nieudzielona(FirebaseWyjątek)

Ta metoda jest wywoływana w odpowiedzi na nieprawidłowe żądanie weryfikacji, na przykład zawierające nieprawidłowy numer telefonu lub kod weryfikacyjny.

onCodeSent(String verificationId, PhoneAuthProvider.ForceConfirmingToken)

Opcjonalnie. Ta metoda jest wywoływana po wysłaniu kodu weryfikacyjnego SMS-em na podany numer telefonu.

Po wywołaniu tej metody większość aplikacji wyświetla interfejs użytkownika, który prosi o wpisanie kodu weryfikacyjnego z SMS-a. (W tym samym czasie automatyczna weryfikacja może być kontrolowana w tle). Następnie, gdy użytkownik wpisze kod weryfikacyjny, możesz użyć tego kodu i identyfikatora weryfikacyjnego, który został przekazany do metody, do utworzenia obiektu PhoneAuthCredential, za pomocą którego możesz zalogować użytkownika. Niektóre aplikacje mogą jednak zaczekać na wywołanie onCodeAutoRetrievalTimeOut z wyświetleniem interfejsu kodu weryfikacyjnego (niezalecane).

onCodeAutoRetrievalTimeOut(identyfikator weryfikacji ciągu znaków)

Opcjonalnie. Ta metoda jest wywoływana po upływie czasu oczekiwania określonego w ustawieniu verifyPhoneNumber bez wcześniejszego wywołania onVerificationCompleted. Na urządzeniach bez karty SIM ta metoda jest wywoływana natychmiast, ponieważ automatyczne pobieranie SMS-ów jest niemożliwe.

Niektóre aplikacje blokują dane wejściowe użytkownika do upłynięcia okresu automatycznej weryfikacji. Potem wyświetlają się wtedy interfejs, który wyświetla komunikat z prośbą o wpisanie kodu weryfikacyjnego z SMS-a (niezalecane).

Tworzenie obiektu PhoneAuthCredential

Gdy użytkownik wpisze kod weryfikacyjny, który Firebase wysłał na jego telefon, utwórz obiekt PhoneAuthCredential, korzystając z kodu weryfikacyjnego i identyfikatora weryfikacji przekazanego do wywołania zwrotnego onCodeSent lub onCodeAutoRetrievalTimeOut. (Po wywołaniu onVerificationCompleted otrzymujesz bezpośrednio obiekt PhoneAuthCredential, więc możesz pominąć ten krok).

Aby utworzyć obiekt PhoneAuthCredential, wywołaj PhoneAuthProvider.getCredential:

Kotlin+KTX

val credential = PhoneAuthProvider.getCredential(verificationId!!, code)

Java

PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);

Logowanie użytkownika

Gdy otrzymasz obiekt PhoneAuthCredential (w wywołaniu zwrotnym onVerificationCompleted lub wywołaniu PhoneAuthProvider.getCredential), dokończ proces logowania, przekazując obiekt PhoneAuthCredential do FirebaseAuth.signInWithCredential:

Kotlin+KTX

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
    auth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithCredential:success")

                val user = task.result?.user
            } else {
                // Sign in failed, display a message and update the UI
                Log.w(TAG, "signInWithCredential:failure", task.exception)
                if (task.exception is FirebaseAuthInvalidCredentialsException) {
                    // The verification code entered was invalid
                }
                // Update UI
            }
        }
}

Java

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success");

                        FirebaseUser user = task.getResult().getUser();
                        // Update UI
                    } else {
                        // Sign in failed, display a message and update the UI
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid
                        }
                    }
                }
            });
}

Testowanie za pomocą fikcyjnych numerów telefonów

W konsoli Firebase możesz skonfigurować fikcyjne numery telefonów na potrzeby programowania. Testowanie fikcyjnych numerów telefonu daje następujące korzyści:

  • Przetestuj uwierzytelnianie za pomocą numeru telefonu bez przekraczania limitu wykorzystania.
  • Przetestuj uwierzytelnianie numeru telefonu bez wysyłania faktycznego SMS-a.
  • Przeprowadzaj kolejne testy z tym samym numerem telefonu bez ograniczania limitu. Pozwala to zminimalizować ryzyko odrzucenia podczas procesu sprawdzania w sklepie z aplikacjami, jeśli weryfikator użyje do testów tego samego numeru telefonu.
  • Możesz łatwo przeprowadzać testy w środowiskach programistycznych bez żadnych dodatkowych czynności, takich jak możliwość tworzenia aplikacji w symulatorze iOS lub w emulatorze Androida bez Usług Google Play.
  • Pisz testy integracji bez blokowania przez testy zabezpieczeń, które zwykle stosują się do prawdziwych numerów telefonów w środowisku produkcyjnym.

Fikcyjne numery telefonów muszą spełniać te wymagania:

  1. Upewnij się, że używane numery telefonów są fałszywe i nie istnieją. Uwierzytelnianie Firebase nie umożliwia ustawiania istniejących numerów telefonów używanych przez prawdziwych użytkowników jako numerów testowych. Jedną z opcji jest użycie 555 numerów z prefiksem w amerykańskich testowych numerach telefonów, na przykład: +1 650-555-3434
  2. Numery telefonów muszą być poprawnie sformatowane pod kątem długości i innych ograniczeń. Nadal przechodzą one taką samą weryfikację jak numer telefonu rzeczywistego użytkownika.
  3. Możesz dodać maksymalnie 10 numerów telefonów na potrzeby programowania.
  4. Używaj testowych numerów telefonów lub kodów, które trudno odgadnąć, i często je zmieniaj.

Tworzenie fikcyjnych numerów telefonów i kodów weryfikacyjnych

  1. W konsoli Firebase otwórz sekcję Uwierzytelnianie.
  2. Na karcie Metoda logowania włącz dostawcę telefonu, jeśli nie jest jeszcze włączony.
  3. Otwórz menu nawigacyjne Numery telefonów do testowania.
  4. Podaj numer telefonu, który chcesz przetestować, np. +1 650-555-3434.
  5. Podaj 6-cyfrowy kod weryfikacyjny tego numeru, np. 654321.
  6. Dodaj numer. W razie potrzeby możesz usunąć numer telefonu i jego kod. Aby to zrobić, najedź kursorem na odpowiedni wiersz i kliknij ikonę kosza.

Testy ręczne

Możesz od razu zacząć używać fikcyjnego numeru telefonu we wniosku. Dzięki temu możesz przeprowadzać testy ręczne na etapach programowania, nie powodując problemów z limitami ani ich ograniczania. Możesz też przeprowadzać testy bezpośrednio za pomocą 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, aby dokończyć logowanie, musisz podać wcześniej skonfigurowany kod weryfikacyjny.

Gdy się zalogujesz, zostanie utworzony użytkownik Firebase z tym numerem telefonu. Działa on tak samo i ma takie same właściwości jak prawdziwy użytkownik numeru telefonu. W ten sam sposób może również korzystać z Bazy danych czasu rzeczywistego/Cloud Firestore oraz innych usług. Token tożsamości wygenerowany podczas tego procesu ma taki sam podpis jak prawdziwy użytkownik numeru telefonu.

Możesz też ustawić rolę testową dla tych użytkowników za pomocą roszczeń niestandardowych, aby odróżnić ich jako fałszywych użytkowników, jeśli chcesz jeszcze bardziej ograniczyć dostęp do nich.

Aby ręcznie aktywować przepływ reCAPTCHA do testowania, użyj metody forceRecaptchaFlowForTesting().

// Force reCAPTCHA flow
FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();

Testowanie integracji

Oprócz testowania ręcznego Uwierzytelnianie Firebase udostępnia interfejsy API, które ułatwiają pisanie testów integracji na potrzeby testowania uwierzytelniania telefonicznego. Te interfejsy API wyłączają weryfikację aplikacji przez wyłączenie wymogu reCAPTCHA w internecie oraz cichych powiadomień push na urządzeniach z iOS. Dzięki temu możliwe jest testowanie automatyzacji w tych procesach i łatwiejsze ich wdrożenie. Rozwiązanie pozwala też testować procesy błyskawicznej weryfikacji na Androidzie.

W Androidzie wywołaj setAppVerificationDisabledForTesting() przed wywołaniem signInWithPhoneNumber. W ten sposób weryfikacja aplikacji zostanie wyłączona automatycznie, co umożliwi podanie numeru telefonu bez wpisywania go ręcznie. Mimo że Play Integrity i reCAPTCHA są wyłączone, przy użyciu prawdziwego numeru telefonu nadal nie można się zalogować. Za pomocą tego interfejsu API można używać tylko fikcyjnych numerów telefonów.

// Turn off phone auth app verification.
FirebaseAuth.getInstance().getFirebaseAuthSettings()
   .setAppVerificationDisabledForTesting();

Jeśli dzwonisz pod numer verifyPhoneNumber przy użyciu fikcyjnego numeru, następuje wywołanie zwrotne onCodeSent, w którym trzeba podać odpowiedni kod weryfikacyjny. Umożliwia to testowanie w emulatorach Androida.

Java

String phoneNum = "+16505554567";
String testVerificationCode = "123456";

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
FirebaseAuth auth = FirebaseAuth.getInstance();
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth)
        .setPhoneNumber(phoneNum)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onCodeSent(@NonNull String verificationId,
                                   @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                // Save the verification id somewhere
                // ...

                // The corresponding whitelisted code above should be used to complete sign-in.
                MainActivity.this.enableUserManuallyInputCode();
            }

            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            @Override
            public void onVerificationFailed(@NonNull FirebaseException e) {
                // ...
            }
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

val phoneNum = "+16505554567"
val testVerificationCode = "123456"

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
val options = PhoneAuthOptions.newBuilder(Firebase.auth)
    .setPhoneNumber(phoneNum)
    .setTimeout(30L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        override fun onCodeSent(
            verificationId: String,
            forceResendingToken: PhoneAuthProvider.ForceResendingToken,
        ) {
            // Save the verification id somewhere
            // ...

            // The corresponding whitelisted code above should be used to complete sign-in.
            this@MainActivity.enableUserManuallyInputCode()
        }

        override fun onVerificationCompleted(phoneAuthCredential: PhoneAuthCredential) {
            // Sign in with the credential
            // ...
        }

        override fun onVerificationFailed(e: FirebaseException) {
            // ...
        }
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Możesz też przetestować procesy automatycznego pobierania na Androidzie, ustawiając fikcyjną liczbę i odpowiadający jej kod weryfikacyjny do automatycznego pobierania, wywołując funkcję setAutoRetrievedSmsCodeForPhoneNumber.

Wywołanie verifyPhoneNumber wywołuje bezpośrednio onVerificationCompleted za pomocą PhoneAuthCredential. Ta funkcja działa tylko w przypadku fikcyjnych numerów telefonów.

Upewnij się, że opcja ta jest wyłączona i żadne fikcyjne numery telefonów nie są zakodowane na stałe w aplikacji publikowanej w Sklepie Google Play.

Java

// The test phone number and code should be whitelisted in the console.
String phoneNumber = "+16505554567";
String smsCode = "123456";

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings();

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode);

PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth)
        .setPhoneNumber(phoneNumber)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
                // Instant verification is applied and a credential is directly returned.
                // ...
            }

            // ...
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

// The test phone number and code should be whitelisted in the console.
val phoneNumber = "+16505554567"
val smsCode = "123456"

val firebaseAuth = Firebase.auth
val firebaseAuthSettings = firebaseAuth.firebaseAuthSettings

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode)

val options = PhoneAuthOptions.newBuilder(firebaseAuth)
    .setPhoneNumber(phoneNumber)
    .setTimeout(60L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(credential: PhoneAuthCredential) {
            // Instant verification is applied and a credential is directly returned.
            // ...
        }

        // ...
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Dalsze kroki

Gdy użytkownik loguje się po raz pierwszy, tworzone jest nowe konto użytkownika, które jest łączone z danymi logowania (nazwa użytkownika i hasło, numer telefonu lub informacje o dostawcy uwierzytelniania). Nowe konto jest przechowywane w ramach Twojego projektu Firebase i może być używane do identyfikowania użytkowników we wszystkich aplikacjach w Twoim projekcie niezależnie od tego, jak się on loguje.

  • W swoich aplikacjach możesz uzyskać podstawowe informacje o profilu użytkownika z obiektu FirebaseUser. Patrz: Zarządzanie użytkownikami.

  • W regułach zabezpieczeń Bazy danych czasu rzeczywistego Firebase i Cloud Storage możesz pobrać ze zmiennej auth unikalny identyfikator użytkownika zalogowanego użytkownika i użyć go do kontrolowania, do jakich danych użytkownik ma dostęp.

Możesz zezwolić użytkownikom na logowanie się w aplikacji przy użyciu różnych dostawców uwierzytelniania, łącząc dane logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika.

Aby wylogować użytkownika, wywołaj signOut:

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();