Aggiungi facilmente l'accesso alla tua app per Android con FirebaseUI

FirebaseUI è una libreria creata in aggiunta all'SDK Firebase Authentication che fornisce flussi di interfaccia utente drop-in da utilizzare all'interno dell'app. FirebaseUI offre i seguenti vantaggi:

  • Più fornitori - flussi di accesso per email/password, link email, telefono l'autenticazione, l'accesso con Google, l'accesso a Facebook, l'accesso a Twitter e l'accesso a GitHub.
  • Gestione dell'account: flussi per gestire le attività di gestione dell'account, ad esempio creazione di account e reimpostazione delle password.
  • Collegamento dell'account: flussi per collegare in sicurezza gli account utente tra i diversi account. di Google Cloud.
  • Upgrade per utenti anonimi: flusso per eseguire in sicurezza l'upgrade degli utenti anonimi.
  • Temi personalizzati: personalizza l'aspetto di FirebaseUI in base alla tua app. Inoltre, Poiché FirebaseUI è open source, puoi creare un fork del progetto e personalizzarlo in base alle tue esigenze.
  • Smart Lock per password: integrazione automatica con Smart Lock per password per un accesso rapido su più dispositivi.

Prima di iniziare

  1. Se non l'hai già fatto, aggiungi Firebase al tuo progetto Android.

  2. Aggiungi le dipendenze per FirebaseUI al file build.gradle a livello di app. Se vuoi supportare l'accesso con Facebook o Twitter, includi anche il SDK Facebook e Twitter:

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

    L'SDK FirebaseUI Auth presenta dipendenze trasitive dall'SDK Firebase e dall'SDK Google Play Services.

  3. Nella console Firebase, apri la sezione Autenticazione e attiva i metodi di accesso che vuoi supportare. Alcuni metodi di accesso richiedono informazioni aggiuntive, solitamente disponibili nello sviluppatore del servizio Google Cloud.

  4. Se hai attivato Accedi con Google:

    1. Quando richiesto nella console, scarica il file di configurazione di Firebase aggiornato (google-services.json), che ora contiene le informazioni sul client OAuth richiesta per Accedi con Google.

    2. Sposta questo file di configurazione aggiornato nel tuo progetto Android Studio, sostituendo il file di configurazione corrispondente, ora obsoleto. (consulta Aggiungere Firebase al progetto Android).

    3. Se non hai ancora specificato l'impronta digitale SHA dell'app, puoi farlo dalla Pagina Impostazioni della console Firebase. Consulta Autenticazione del client. per maggiori dettagli su come ottenere l'impronta SHA della tua app.

  5. Se supporti l'accesso con Facebook o Twitter, aggiungi risorse di stringa a strings.xml che specificano le informazioni identificative richieste da ogni fornitore:

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

Accedi

Crea un ActivityResultLauncher che registra un callback per FirebaseUI Contratto relativo al risultato dell'attività:

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);
            }
        }
);

Per avviare il flusso di accesso FirebaseUI, crea un intent di accesso con il tuo metodi di accesso preferiti:

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

Al termine del flusso di accesso, riceverai il risultato 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.
        // ...
    }
}

Configura i metodi di accesso

  1. Nella console Firebase, apri la sezione Autenticazione. Il giorno Nella scheda Metodo di accesso, attiva il provider Email/Password. Nota l'accesso con email/password deve essere abilitato per utilizzare l'accesso tramite link e-mail.

  2. Nella stessa sezione, attiva il metodo di accesso Link via email (accesso senza password) e fai clic su Salva.

  3. Dovrai inoltre abilitare Firebase Dynamic Links per utilizzare l'accesso tramite link email. Nella Nella console di Firebase, fai clic su Link dinamici in Coinvolgi nella barra di navigazione. Fai clic su Inizia e aggiungi un dominio. Il dominio che scegli qui verrà indicato nell'email i link inviati ai tuoi utenti.

  4. Puoi attivare l'accesso tramite link email in FirebaseUI chiamando enableEmailLinkSignIn su un'istanza EmailBuilder. Dovrai anche fornire un oggetto ActionCodeSettings valido con setHandleCodeInApp impostato su true. Inoltre, devi inserire nella lista consentita l'URL che passi a setUrl. Puoi farlo nella console Firebase, in Autenticazione -> Metodi di accesso -> Domini autorizzati.

    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. Se vuoi individuare il link in un'attività specifica, segui i passaggi indicati qui In caso contrario, il link reindirizzerà all'attività del tuo programma di avvio.

  6. Una volta individuato il link diretto, dovrai chiamare il numero di verifica per consentirci di gestirlo. Se puoi, devi trasmettercelo tramite 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. Facoltativo L'accesso cross-device via email è supportato, il che significa che il link inviato tramite la tua app per Android può essere utilizzata per accedere al tuo sito web o alle app Apple. Per impostazione predefinita, il supporto cross-device sia abilitato. Puoi disabilitarlo chiamando setForceSameDevice sull'istanza EmailBuilder.

    Consulta FirebaseUI-Web e FirebaseUI-iOS per ulteriori informazioni.

Esci

FirebaseUI fornisce metodi pratici per uscire da Firebase Authentication così come tutti i provider di identità social:

Kotlin+KTX

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

Java

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

Puoi anche eliminare completamente l'account dell'utente:

Kotlin+KTX

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

Java

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

Personalizzazione

Per impostazione predefinita, FirebaseUI utilizza AppCompat per i temi, il che significa che adottare la combinazione di colori dell'app. Se hai bisogno di ulteriore personalizzazione, Passa un tema e un logo allo strumento per la creazione di Intent per l'accesso:

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

Puoi anche impostare norme sulla privacy e Termini di servizio personalizzati:

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

Passaggi successivi

  • Per ulteriori informazioni sull'utilizzo e sulla personalizzazione di FirebaseUI, consulta README su GitHub.
  • Se rilevi un problema in FirebaseUI e vuoi segnalarlo, utilizza la Tracker dei problemi GitHub.