Z łatwością dodaj logowanie do aplikacji na Androida za pomocą FirebaseUI

FirebaseUI to biblioteka zbudowana na pakiecie SDK uwierzytelniania Firebase, która udostępnia przepływy interfejsu użytkownika do użycia w Twojej aplikacji. FirebaseUI zapewnia następujące korzyści:

  • Wielu dostawców — przepływy logowania dla adresu e-mail/hasła, łącza e-mail, uwierzytelniania telefonu, logowania Google, logowania do Facebooka, logowania do Twittera i logowania do GitHub.
  • Zarządzanie kontami — przepływy do obsługi zadań zarządzania kontami, takich jak tworzenie kont i resetowanie haseł.
  • Łączenie kont — przepływy w celu bezpiecznego łączenia kont użytkowników między dostawcami tożsamości.
  • Uaktualnianie anonimowych użytkowników — przepływy w celu bezpiecznego uaktualniania anonimowych użytkowników.
  • Niestandardowe motywy — dostosuj wygląd interfejsu FirebaseUI do swojej aplikacji. Ponadto, ponieważ FirebaseUI jest open source, możesz rozwidlić projekt i dostosować go dokładnie do swoich potrzeb.
  • Smart Lock for Passwords — automatyczna integracja z funkcją Smart Lock for Passwords w celu szybkiego logowania na różnych urządzeniach.

Zanim zaczniesz

  1. Jeśli jeszcze tego nie zrobiłeś, dodaj Firebase do swojego projektu na Androida .

  2. Dodaj zależności FirebaseUI do pliku build.gradle na poziomie aplikacji. Jeśli chcesz obsługiwać logowanie za pomocą Facebooka lub Twittera, dołącz także zestawy SDK Facebooka i Twittera:

    dependencies {
        // ...
    
        implementation 'com.firebaseui:firebase-ui-auth:7.2.0'
    
        // Required only if Facebook login support is required
        // Find the latest Facebook SDK releases here: https://goo.gl/Ce5L94
        implementation 'com.facebook.android:facebook-android-sdk:8.x'
    }
    

    Pakiet FirebaseUI Auth SDK ma przejściowe zależności od pakietu SDK Firebase i pakietu SDK usług Google Play.

  3. W konsoli Firebase otwórz sekcję Uwierzytelnianie i włącz metody logowania, które chcesz obsługiwać. Niektóre metody logowania wymagają dodatkowych informacji, zwykle dostępnych w konsoli programisty usługi.

  4. Jeśli włączyłeś Logowanie przez Google:

    1. Po wyświetleniu monitu w konsoli pobierz zaktualizowany plik konfiguracyjny Firebase ( google-services.json ), który zawiera teraz informacje o kliencie OAuth wymagane do logowania się przez Google.

    2. Przenieś ten zaktualizowany plik konfiguracyjny do swojego projektu Android Studio, zastępując nieaktualny odpowiedni plik konfiguracyjny. (Zobacz Dodawanie Firebase do projektu na Androida .)

    3. Jeśli jeszcze nie określiłeś odcisku cyfrowego SHA swojej aplikacji, zrób to na stronie Ustawienia w konsoli Firebase. Zobacz Uwierzytelnianie klienta , aby uzyskać szczegółowe informacje na temat uzyskiwania odcisku palca SHA aplikacji.

  5. Jeśli obsługujesz logowanie za pomocą Facebooka lub Twittera, dodaj do pliku strings.xml zasoby ciągów, które określają informacje identyfikujące wymagane przez każdego dostawcę:

    
    <resources>
      <!-- Facebook application ID and custom URL scheme (app ID prefixed by 'fb'). -->
      <string name="facebook_application_id" translatable="false">YOUR_APP_ID</string>
      <string name="facebook_login_protocol_scheme" translatable="false">fbYOUR_APP_ID</string>
    </resources>
    

Zalogować się

Utwórz ActivityResultLauncher , który rejestruje wywołanie zwrotne dla kontraktu wyniku działania FirebaseUI:

Kotlin+KTX

// See: https://developer.android.com/training/basics/intents/result
private val signInLauncher = registerForActivityResult(
    FirebaseAuthUIActivityResultContract(),
) { res ->
    this.onSignInResult(res)
}

Java

// See: https://developer.android.com/training/basics/intents/result
private final ActivityResultLauncher<Intent> signInLauncher = registerForActivityResult(
        new FirebaseAuthUIActivityResultContract(),
        new ActivityResultCallback<FirebaseAuthUIAuthenticationResult>() {
            @Override
            public void onActivityResult(FirebaseAuthUIAuthenticationResult result) {
                onSignInResult(result);
            }
        }
);

Aby rozpocząć proces logowania w interfejsie FirebaseUI, utwórz intencję logowania przy użyciu preferowanych metod logowania:

Kotlin+KTX

// Choose authentication providers
val providers = arrayListOf(
    AuthUI.IdpConfig.EmailBuilder().build(),
    AuthUI.IdpConfig.PhoneBuilder().build(),
    AuthUI.IdpConfig.GoogleBuilder().build(),
    AuthUI.IdpConfig.FacebookBuilder().build(),
    AuthUI.IdpConfig.TwitterBuilder().build(),
)

// Create and launch sign-in intent
val signInIntent = AuthUI.getInstance()
    .createSignInIntentBuilder()
    .setAvailableProviders(providers)
    .build()
signInLauncher.launch(signInIntent)

Java

// Choose authentication providers
List<AuthUI.IdpConfig> providers = Arrays.asList(
        new AuthUI.IdpConfig.EmailBuilder().build(),
        new AuthUI.IdpConfig.PhoneBuilder().build(),
        new AuthUI.IdpConfig.GoogleBuilder().build(),
        new AuthUI.IdpConfig.FacebookBuilder().build(),
        new AuthUI.IdpConfig.TwitterBuilder().build());

// Create and launch sign-in intent
Intent signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .build();
signInLauncher.launch(signInIntent);

Po zakończeniu procesu logowania otrzymasz wynik w onSignInResult :

Kotlin+KTX

private fun onSignInResult(result: FirebaseAuthUIAuthenticationResult) {
    val response = result.idpResponse
    if (result.resultCode == RESULT_OK) {
        // Successfully signed in
        val user = FirebaseAuth.getInstance().currentUser
        // ...
    } else {
        // Sign in failed. If response is null the user canceled the
        // sign-in flow using the back button. Otherwise check
        // response.getError().getErrorCode() and handle the error.
        // ...
    }
}

Java

private void onSignInResult(FirebaseAuthUIAuthenticationResult result) {
    IdpResponse response = result.getIdpResponse();
    if (result.getResultCode() == RESULT_OK) {
        // Successfully signed in
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        // ...
    } else {
        // Sign in failed. If response is null the user canceled the
        // sign-in flow using the back button. Otherwise check
        // response.getError().getErrorCode() and handle the error.
        // ...
    }
}

Skonfiguruj metody logowania

  1. W konsoli Firebase otwórz sekcję Uwierzytelnianie . Na karcie Metoda logowania włącz dostawcę adresu e-mail/hasła . Pamiętaj, że logowanie za pomocą adresu e-mail/hasła musi być włączone, aby można było korzystać z logowania za pomocą łącza e-mail.

  2. W tej samej sekcji włącz metodę logowania przez łącze e-mail (logowanie bez hasła) i kliknij przycisk Zapisz .

  3. Będziesz także musiał włączyć Linki dynamiczne Firebase, aby używać logowania za pomocą linku e-mail. W konsoli Firebase kliknij Linki dynamiczne w obszarze Zaangażuj na pasku nawigacyjnym. Kliknij Pierwsze kroki i dodaj domenę. Wybrana tutaj domena będzie odzwierciedlona w linkach e-mail wysyłanych do użytkowników.

  4. Możesz włączyć logowanie za pomocą łącza e-mail w FirebaseUI, wywołując enableEmailLinkSignIn w instancji EmailBuilder . Będziesz także musiał podać prawidłowy obiekt ActionCodeSettings z setHandleCodeInApp ustawionym na true. Dodatkowo musisz umieścić na białej liście adres URL, który przekazujesz do setUrl , co można zrobić w konsoli Firebase , w obszarze Uwierzytelnianie -> Metody logowania -> Domeny autoryzowane.

    Kotlin+KTX

    val actionCodeSettings = ActionCodeSettings.newBuilder()
        .setAndroidPackageName( // yourPackageName=
            "...", // installIfNotAvailable=
            true, // minimumVersion=
            null,
        )
        .setHandleCodeInApp(true) // This must be set to true
        .setUrl("https://google.com") // This URL needs to be whitelisted
        .build()
    
    val providers = listOf(
        EmailBuilder()
            .enableEmailLinkSignIn()
            .setActionCodeSettings(actionCodeSettings)
            .build(),
    )
    val signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .build()
    signInLauncher.launch(signInIntent)

    Java

    ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder()
            .setAndroidPackageName(
                    /* yourPackageName= */ "...",
                    /* installIfNotAvailable= */ true,
                    /* minimumVersion= */ null)
            .setHandleCodeInApp(true) // This must be set to true
            .setUrl("https://google.com") // This URL needs to be whitelisted
            .build();
    
    List<AuthUI.IdpConfig> providers = Arrays.asList(
            new AuthUI.IdpConfig.EmailBuilder()
                    .enableEmailLinkSignIn()
                    .setActionCodeSettings(actionCodeSettings)
                    .build()
    );
    Intent signInIntent = AuthUI.getInstance()
            .createSignInIntentBuilder()
            .setAvailableProviders(providers)
            .build();
    signInLauncher.launch(signInIntent);
  5. Jeśli chcesz złapać link w określonej czynności, wykonaj czynności opisane tutaj . W przeciwnym razie link przekieruje do Twojej aktywności w programie uruchamiającym.

  6. Po złapaniu głębokiego linku będziesz musiał zadzwonić, aby sprawdzić, czy możemy to dla Ciebie zrobić. Jeśli możemy, musisz przekazać go nam za pomocą setEmailLink .

    Kotlin+KTX

    if (AuthUI.canHandleIntent(intent)) {
        val extras = intent.extras ?: return
        val link = extras.getString("email_link_sign_in")
        if (link != null) {
            val signInIntent = AuthUI.getInstance()
                .createSignInIntentBuilder()
                .setEmailLink(link)
                .setAvailableProviders(providers)
                .build()
            signInLauncher.launch(signInIntent)
        }
    }

    Java

    if (AuthUI.canHandleIntent(getIntent())) {
        if (getIntent().getExtras() == null) {
            return;
        }
        String link = getIntent().getExtras().getString("email_link_sign_in");
        if (link != null) {
            Intent signInIntent = AuthUI.getInstance()
                    .createSignInIntentBuilder()
                    .setEmailLink(link)
                    .setAvailableProviders(providers)
                    .build();
            signInLauncher.launch(signInIntent);
        }
    }
  7. Obsługiwane jest opcjonalne logowanie za pomocą łącza e-mail z wielu urządzeń, co oznacza, że ​​łącza wysłanego za pośrednictwem aplikacji na Androida można używać do logowania się w sieci lub aplikacjach Apple. Domyślnie obsługa wielu urządzeń jest włączona. Możesz go wyłączyć, wywołując metodę setForceSameDevice w instancji EmailBuilder .

    Zobacz FirebaseUI-Web i FirebaseUI-iOS, aby uzyskać więcej informacji.

Wyloguj się

FirebaseUI zapewnia wygodne metody wylogowywania się z Firebase Authentication, a także wszystkich dostawców tożsamości społecznościowych:

Kotlin+KTX

AuthUI.getInstance()
    .signOut(this)
    .addOnCompleteListener {
        // ...
    }

Java

AuthUI.getInstance()
        .signOut(this)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            public void onComplete(@NonNull Task<Void> task) {
                // ...
            }
        });

Możesz także całkowicie usunąć konto użytkownika:

Kotlin+KTX

AuthUI.getInstance()
    .delete(this)
    .addOnCompleteListener {
        // ...
    }

Java

AuthUI.getInstance()
        .delete(this)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                // ...
            }
        });

Dostosowywanie

Domyślnie FirebaseUI używa AppCompat do tworzenia motywów, co oznacza, że ​​w naturalny sposób przyjmie schemat kolorów Twojej aplikacji. Jeśli potrzebujesz dalszych dostosowań, możesz przekazać motyw i logo do konstruktora Intent logowania:

Kotlin+KTX

val signInIntent = AuthUI.getInstance()
    .createSignInIntentBuilder()
    .setAvailableProviders(providers)
    .setLogo(R.drawable.my_great_logo) // Set logo drawable
    .setTheme(R.style.MySuperAppTheme) // Set theme
    .build()
signInLauncher.launch(signInIntent)

Java

Intent signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .setLogo(R.drawable.my_great_logo)      // Set logo drawable
        .setTheme(R.style.MySuperAppTheme)      // Set theme
        .build();
signInLauncher.launch(signInIntent);

Możesz także ustawić własną politykę prywatności i warunki korzystania z usługi:

Kotlin+KTX

val signInIntent = AuthUI.getInstance()
    .createSignInIntentBuilder()
    .setAvailableProviders(providers)
    .setTosAndPrivacyPolicyUrls(
        "https://example.com/terms.html",
        "https://example.com/privacy.html",
    )
    .build()
signInLauncher.launch(signInIntent)

Java

Intent signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .setTosAndPrivacyPolicyUrls(
                "https://example.com/terms.html",
                "https://example.com/privacy.html")
        .build();
signInLauncher.launch(signInIntent);

Następne kroki

  • Aby uzyskać więcej informacji na temat używania i dostosowywania interfejsu FirebaseUI, zobacz plik README w serwisie GitHub.
  • Jeśli znajdziesz problem w FirebaseUI i chcesz go zgłosić, użyj narzędzia do śledzenia problemów GitHub .