Łatwe logowanie się w aplikacji na Androida dzięki FirebaseUI

FirebaseUI to biblioteka utworzona oprócz pakietu SDK Uwierzytelniania Firebase, który udostępnia przepływy w interfejsie użytkownika, w aplikacji. FirebaseUI zapewnia następujące korzyści:

  • Wielu dostawców – procesy logowania za pomocą adresu e-mail i hasła, linku do e-maila i numeru telefonu uwierzytelnianie, logowanie przez Google, logowanie do Facebooka, logowanie do Twittera i logowanie przez GitHuba.
  • Zarządzanie kontem – procesy zarządzania kontem, takie jak: tworzenia kont i resetowania haseł.
  • Łączenie kont – umożliwia bezpieczne łączenie kont użytkowników na różnych tożsamościach. dostawców usług.
  • Uaktualnienie anonimowych użytkowników – proces bezpiecznego uaktualniania anonimowych użytkowników.
  • Motywy niestandardowe – dostosuj wygląd FirebaseUI do swojej aplikacji. Oprócz tego: Ponieważ FirebaseUI to oprogramowanie typu open source, możesz utworzyć rozwidlenie projektu i go dostosować aby dostosować je do swoich potrzeb.
  • Smart Lock na hasła – automatyczna integracja z Smart Lock na hasła i logowanie się na różnych urządzeniach.

Zanim zaczniesz

  1. Jeśli jeszcze nie masz tego za sobą, dodaj Firebase do swojego projektu na Androida.

  2. Dodaj zależności dla FirebaseUI do pliku build.gradle na poziomie aplikacji. Jeśli chcesz umożliwić logowanie się przez Facebooka lub Twittera, umieść także Pakiety SDK dla 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 SDK uwierzytelniania FirebaseUI ma pośrednie zależności od pakietu SDK Firebase oraz pakiet SDK Usług Google Play.

  3. W konsoli Firebase otwórz sekcję Uwierzytelnianie i włącz metod logowania, które chcesz obsługiwać. Niektóre metody logowania wymagają dodatkowe informacje, zwykle dostępne u dewelopera usługi. konsoli.

  4. Jeśli masz włączone Logowanie przez Google:

    1. Gdy w konsoli pojawi się odpowiedni komunikat, pobierz zaktualizowany plik konfiguracyjny Firebase. (google-services.json), która zawiera teraz informacje o kliencie OAuth wymagane do zalogowania się przez Google.

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

    3. Jeśli odcisk cyfrowy SHA aplikacji nie został jeszcze określony, zrób to Strona Ustawienia konsoli Firebase. Przeczytaj artykuł Uwierzytelnianie klienta. , aby dowiedzieć się, jak pobrać odcisk cyfrowy SHA aplikacji.

  5. Jeśli obsługujesz logowanie się za pomocą Facebooka lub Twittera, dodaj zasoby ciągu znaków do strings.xml, które określają informacje identyfikacyjne wymagane przez każdy z nich dostawca:

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

Zaloguj się

Utwórz ActivityResultLauncher, który rejestruje wywołanie zwrotne FirebaseUI Umowa dotycząca wyniku aktywności:

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 się w FirebaseUI, utwórz intencję logowania za pomocą preferowane metody 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);

Gdy się zalogujesz, 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. Dzień kartę Metoda logowania, włącz dostawcę E-mail/hasło. Notatka że logowanie za pomocą adresu e-mail za pomocą linku wymaga włączenia logowania za pomocą adresu e-mail i hasła.

  2. W tej samej sekcji włącz logowanie się przy użyciu opcji Link w e-mailu (logowanie bez hasła). i kliknij Zapisz.

  3. Aby korzystać z logowania się za pomocą linku e-mail, musisz też włączyć Linki dynamiczne Firebase. W FirebaseKonsola, kliknij Linki dynamiczne w sekcji Zaangażowanie na pasku nawigacyjnym. Kliknij Pierwsze kroki i dodawanie domeny. Wybrana domena zostanie wymieniona w e-mailu wysyłanych do użytkowników.

  4. Możesz włączyć logowanie przy użyciu linku w e-mailach w FirebaseUI, wywołując funkcję enableEmailLinkSignIn w EmailBuilder instancję. Musisz też podać prawidłowy obiekt ActionCodeSettings z Wartość setHandleCodeInApp ma wartość Prawda. Dodatkowo musisz umieścić na białej liście adres URL, do którego przekazujesz wiadomości setUrl. Możesz to zrobić w konsoli Firebase w sekcji Uwierzytelnianie -> Metody logowania -> Autoryzowane domeny.

    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 zobaczyć link w ramach konkretnego działania, wykonaj te czynności: tutaj. W przeciwnym razie link będzie przekierowują do Twojej aktywności w programie uruchamiającym.

  6. Gdy złapiesz precyzyjny link, musisz wywołać funkcję potwierdzenia, że możemy się tym zająć. Jeśli prześlij nam go za pomocą usługi 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. Opcjonalnie Logowanie e-mailem za pomocą linku na innym urządzeniu jest obsługiwane, co oznacza, że link wysłany przez aplikacja na Androida może być używana do logowania się w internecie lub aplikacjach Apple. Domyślnie obsługa wielu urządzeń jest włączona. Aby je wyłączyć, wywołaj setForceSameDevice w instancji EmailBuilder.

    Zobacz FirebaseUI-Web. i FirebaseUI-iOS .

Wyloguj się

FirebaseUI udostępnia wygodne metody wylogowywania się z Uwierzytelniania Firebase 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 też 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 do tworzenia motywów używa AppCompat, co oznacza, że zastosuj schemat kolorów Twojej aplikacji. Jeśli potrzebujesz dalszego dostosowania, przekaż motyw i logo do kreatora 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 też określić 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