Aggiungi facilmente l'accesso alla tua app Android con FirebaseUI

FirebaseUI è una libreria basata su Firebase Authentication SDK che fornisce flussi di interfaccia utente drop-in da utilizzare nella tua app. FirebaseUI offre i seguenti vantaggi:

  • Provider multipli : flussi di accesso per e-mail/password, collegamento e-mail, autenticazione telefonica, accesso a Google, accesso a Facebook, accesso a Twitter e accesso a GitHub.
  • Gestione account : flussi per gestire le attività di gestione dell'account, come la creazione dell'account e la reimpostazione della password.
  • Collegamento account : flussi per collegare in modo sicuro gli account utente tra provider di identità.
  • Aggiornamento utente anonimo : flussi per aggiornare in modo sicuro gli utenti anonimi.
  • Temi personalizzati : personalizza l'aspetto di FirebaseUI per adattarlo alla tua app. Inoltre, poiché FirebaseUI è open source, puoi eseguire il fork del progetto e personalizzarlo esattamente in base alle tue esigenze.
  • Smart Lock for Passwords : integrazione automatica con Smart Lock for Passwords per un rapido accesso tra 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 desideri supportare l'accesso con Facebook o Twitter, includi anche gli SDK di 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 di autenticazione FirebaseUI presenta dipendenze transitive sull'SDK di Firebase e sull'SDK dei servizi Google Play.

  3. Nella console Firebase , apri la sezione Autenticazione e abilita i metodi di accesso che desideri supportare. Alcuni metodi di accesso richiedono informazioni aggiuntive, generalmente disponibili nella console per sviluppatori del servizio.

  4. Se hai abilitato l'accesso con Google:

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

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

    3. Se non hai ancora specificato l'impronta digitale SHA della tua app, fallo dalla pagina Impostazioni della console Firebase. Consulta Autenticazione del client per i dettagli su come ottenere l'impronta digitale SHA della tua app.

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

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

Registrazione

Crea un ActivityResultLauncher che registra un callback per il contratto dei risultati dell'attività 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);
            }
        }
);

Per avviare il flusso di accesso FirebaseUI, crea un intento di accesso con i tuoi 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);

Una volta completato il flusso di accesso, riceverai il risultato in 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 . Nella scheda Metodo di accesso , abilita il provider di posta elettronica/password . Tieni presente che l'accesso tramite posta elettronica/password deve essere abilitato per utilizzare l'accesso tramite collegamento tramite posta elettronica.

  2. Nella stessa sezione, abilita il metodo di accesso Collegamento e-mail (accesso senza password) e fai clic su Salva .

  3. Dovrai inoltre abilitare Firebase Dynamic Links per utilizzare l'accesso tramite collegamento e-mail. Nella console Firebase , fai clic su Dynamic Links sotto Coinvolgi nella barra di navigazione. Clicca su Inizia e aggiungi un dominio. Il dominio che scegli qui si rifletterà nei collegamenti email inviati ai tuoi utenti.

  4. Puoi abilitare l'accesso al collegamento e-mail in FirebaseUI chiamando enableEmailLinkSignIn su un'istanza EmailBuilder . Dovrai inoltre fornire un oggetto ActionCodeSettings valido con setHandleCodeInApp impostato su true. Inoltre, devi inserire nella whitelist l'URL che passi a setUrl , operazione che può essere eseguita 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 desideri catturare il collegamento in un'attività specifica, segui i passaggi descritti qui . Altrimenti, il collegamento reindirizzerà alla tua attività di avvio.

  6. Una volta catturato il collegamento diretto, dovrai chiamare per verificare che possiamo gestirlo per te. Se possibile, è necessario 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. È supportato l'accesso opzionale tramite collegamento e-mail tra dispositivi, il che significa che il collegamento inviato tramite l'app Android può essere utilizzato per accedere alle app Web o Apple. Per impostazione predefinita, il supporto multidispositivo è abilitato. Puoi disabilitarlo chiamando setForceSameDevice sull'istanza EmailBuilder .

    Per ulteriori informazioni, consulta FirebaseUI-Web e FirebaseUI-iOS .

Disconnessione

FirebaseUI fornisce metodi pratici per disconnettersi dall'autenticazione Firebase e da 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 adotterà naturalmente la combinazione di colori della tua app. Se hai bisogno di ulteriore personalizzazione puoi passare un tema e un logo al generatore Intent :

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

Prossimi passi

  • Per ulteriori informazioni sull'utilizzo e sulla personalizzazione di FirebaseUI, vedere il file README su GitHub.
  • Se trovi un problema in FirebaseUI e desideri segnalarlo, utilizza il tracker dei problemi di GitHub .