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

FirebaseUI to biblioteka zbudowana na bazie pakietu SDK Firebase Authentication, która zapewnia przepływy interfejsu użytkownika do wykorzystania 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 telefonicznego, logowania Google, logowania do Facebooka, logowania do Twittera i logowania do GitHub.
  • Zarządzanie kontem - przepływy obsługujące zadania związane z zarządzaniem kontem, takie jak tworzenie konta i resetowanie haseł.
  • Łączenie kont — przepływy umożliwiające bezpieczne łączenie kont użytkowników u różnych dostawców tożsamości.
  • Aktualizacja anonimowego użytkownika — przepływy umożliwiające bezpieczne uaktualnianie anonimowych użytkowników.
  • Motywy niestandardowe — dostosuj wygląd FirebaseUI do swojej aplikacji. Ponadto, ponieważ FirebaseUI jest oprogramowaniem typu open source, możesz rozwidlić projekt i dostosować go dokładnie do swoich potrzeb.
  • Smart Lock for Passwords – automatyczna integracja z 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 pakiety 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'
    }
    

    Zestaw SDK FirebaseUI Auth ma przechodnie zależności od zestawu SDK Firebase i zestawu 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 Google:

    1. Gdy w konsoli pojawi się monit, pobierz zaktualizowany plik konfiguracyjny Firebase ( google-services.json ), który zawiera teraz informacje o kliencie OAuth wymagane do logowania się w Google.

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

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

  5. Jeśli obsługujesz logowanie za pomocą Facebooka lub Twittera, dodaj zasoby ciągów do strings.xml , które określają informacje identyfikacyjne 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 wyników 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 FirebaseUI, utwórz zamiar logowania, korzystając z 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 aby móc logować się za pomocą łącza e-mail, musi być włączone logowanie za pomocą adresu e-mail/hasła.

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

  3. Będziesz także musiał włączyć Linki dynamiczne Firebase, aby móc logować się za pomocą łącza e-mail. W konsoli Firebase kliknij Linki dynamiczne w obszarze Angażuj na pasku nawigacyjnym. Kliknij Pierwsze kroki i dodaj domenę. Domena, którą tu wybierzesz, będzie widoczna w linkach e-mail wysyłanych do Twoich użytkowników.

  4. Możesz włączyć podpisywanie linków e-mail w FirebaseUI, wywołując metodę enableEmailLinkSignIn w instancji EmailBuilder . Konieczne będzie także podanie prawidłowego obiektu ActionCodeSettings z ustawioną wartością setHandleCodeInApp na true. Dodatkowo musisz dodać do białej listy adres URL przekazywany do setUrl , co można zrobić w konsoli Firebase , w obszarze 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 złapać link w konkretnym działaniu, 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 musisz zadzwonić i sprawdzić, czy możemy się tym zająć. Jeśli możemy, musisz nam to przekazać 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 na różnych urządzeniach, co oznacza, że ​​łącza wysłanego za pośrednictwem aplikacji na Androida można używać do logowania się w Internecie lub aplikacjach Apple. Domyślnie obsługa wielu urządzeń jest włączona. Możesz to wyłączyć, wywołując setForceSameDevice w instancji EmailBuilder .

    Aby uzyskać więcej informacji, zobacz FirebaseUI-Web i FirebaseUI-iOS .

Wyloguj się

FirebaseUI zapewnia wygodne metody wylogowywania się z uwierzytelniania Firebase, a także ze 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 dalszego dostosowania, możesz przekazać 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 także ustawić niestandardową politykę prywatności i warunki świadczenia usług:

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