Eseguire l'autenticazione con Firebase utilizzando il link email in Android

Puoi utilizzare Firebase Authentication per consentire a un utente di accedere inviandogli un'email contenente un link su cui può fare clic per accedere. Durante la procedura, viene verificato anche l'indirizzo email dell'utente.

L'accesso tramite email offre numerosi vantaggi:

  • Registrazione e accesso semplici.
  • Minore rischio di riutilizzo delle password tra le applicazioni, che può compromettere la sicurezza anche delle password scelte con cura.
  • Possibilità di autenticare un utente e al contempo verificare che sia il proprietario legittimo di un indirizzo email.
  • Per accedere, un utente ha bisogno solo di un account email accessibile. Non è necessario essere proprietari di un numero di telefono o di un account social.
  • Un utente può accedere in modo sicuro senza dover fornire (o ricordare) una password, che può essere scomoda su un dispositivo mobile.
  • Un utente esistente che in precedenza ha eseguito l'accesso con un identificatore email (password o federato) può essere aggiornato per accedere solo con l'email. Ad esempio, un utente che ha dimenticato la password può comunque accedere senza doverla reimpostare.

Prima di iniziare

Configurare il progetto Android

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

  2. Nel file Gradle del modulo (a livello di app) (in genere <project>/<app-module>/build.gradle.kts o <project>/<app-module>/build.gradle), aggiungi la dipendenza per la libreria Firebase Authentication per Android. Ti consigliamo di utilizzare la Firebase Android BoM per controllare il controllo delle versioni della libreria.

    Inoltre, nell'ambito della configurazione di Firebase Authentication, devi aggiungere l' SDK Google Play Services alla tua app.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:34.10.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.5.1")
    }

    Con la Firebase Android BoM, la tua app utilizzerà sempre versioni compatibili delle librerie Firebase Android.

    (Alternativa)  Aggiungere le dipendenze della libreria Firebase senza utilizzare la BoM

    Se scegli di non utilizzare la Firebase BoM, devi specificare la versione di ogni libreria Firebase nella riga di dipendenza.

    Tieni presente che, se utilizzi più librerie Firebase nella tua app, ti consigliamo vivamente di utilizzare la BoM per gestire le versioni delle librerie, in modo da garantire che tutte le versioni siano compatibili.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:24.0.1")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.5.1")
    }

Attivare l'accesso tramite link via email per il progetto Firebase

Per consentire agli utenti di accedere tramite link via email, devi prima attivare il provider email e il metodo di accesso tramite link via email per il progetto Firebase:

  1. Nella Firebase console, apri la sezione Autenticazione.
  2. Nella scheda Metodo di accesso, attiva il provider Email/Password. Tieni presente che l'accesso tramite email/password deve essere attivato per utilizzare l'accesso tramite link via email.
  3. Nella stessa sezione, attiva il metodo di accesso Link via email (accesso senza password).
  4. Fai clic su Salva.

Per avviare la procedura di autenticazione, mostra all'utente un'interfaccia che gli chiede di fornire il suo indirizzo email, quindi chiama sendSignInLinkToEmail per richiedere a Firebase di inviare il link di autenticazione a l'indirizzo email dell'utente.

  1. Costruisci l'oggetto ActionCodeSettings, che fornisce a Firebase le istruzioni su come costruire il link via email. Imposta i seguenti campi:

    • url: il link diretto da incorporare e qualsiasi stato aggiuntivo da trasmettere. Il dominio del link deve essere inserito nella lista consentita nella console Firebase dei domini autorizzati, che puoi trovare nella scheda Metodo di accesso (Autenticazione -> Metodo di accesso). Il link reindirizzerà l'utente a questo URL se l'app non è installata sul suo dispositivo e non è stato possibile installarla.
    • androidPackageName e iOSBundleId: aiutano Firebase Authentication a determinare se deve creare un link solo web o mobile che viene aperto su un dispositivo Android o Apple.
    • handleCodeInApp: impostato su true. L'operazione di accesso deve essere sempre completata nell'app, a differenza di altre azioni email fuori banda (reimpostazione della password e verifiche email). Questo perché, alla fine della procedura, l'utente deve aver eseguito l'accesso e il suo stato di autenticazione deve essere mantenuto nell' app.
    • linkDomain: quando per un progetto vengono definiti dom101}ini di link personalizzati, specifica quale utilizzare quando il link deve essere aperto da un'app mobile specifica. In caso contrario, viene selezionato automaticamente il dominio predefinito (ad esempio, PROJECT_ID.firebaseapp.com).Hosting
    • dynamicLinkDomain: deprecato. Non specificare questo parametro.

    Kotlin

    val actionCodeSettings = actionCodeSettings {
        // URL you want to redirect back to. The domain (www.example.com) for this
        // URL must be whitelisted in the Firebase Console.
        url = "https://www.example.com/finishSignUp?cartId=1234"
        // This must be true
        handleCodeInApp = true
        setIOSBundleId("com.example.ios")
        setAndroidPackageName(
            "com.example.android",
            true, // installIfNotAvailable
            "12", // minimumVersion
        )
    }

    Java

    ActionCodeSettings actionCodeSettings =
            ActionCodeSettings.newBuilder()
                    // URL you want to redirect back to. The domain (www.example.com) for this
                    // URL must be whitelisted in the Firebase Console.
                    .setUrl("https://www.example.com/finishSignUp?cartId=1234")
                    // This must be true
                    .setHandleCodeInApp(true)
                    .setIOSBundleId("com.example.ios")
                    .setAndroidPackageName(
                            "com.example.android",
                            true, /* installIfNotAvailable */
                            "12"    /* minimumVersion */)
                    .build();

    Per saperne di più su ActionCodeSettings, consulta la sezione Trasmettere lo stato nelle azioni email.

  2. Chiedi all'utente il suo indirizzo email.

  3. Invia il link di autenticazione all'indirizzo email dell'utente e salva l'indirizzo email dell'utente nel caso in cui l'utente completi l'accesso tramite email sullo stesso dispositivo.

    Kotlin

    Firebase.auth.sendSignInLinkToEmail(email, actionCodeSettings)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "Email sent.")
            }
        }

    Java

    FirebaseAuth auth = FirebaseAuth.getInstance();
    auth.sendSignInLinkToEmail(email, actionCodeSettings)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Email sent.");
                    }
                }
            });

Problemi di sicurezza

Per impedire che un link di accesso venga utilizzato per accedere come utente non previsto o su un dispositivo non previsto, Firebase Authentication richiede che l'indirizzo email dell'utente venga fornito al termine della procedura di accesso. Affinché l'accesso vada a buon fine, questo indirizzo email deve corrispondere all'indirizzo a cui è stato inviato originariamente il link di accesso.

Puoi semplificare questa procedura per gli utenti che aprono il link di accesso sullo stesso dispositivo su cui lo richiedono memorizzando localmente il loro indirizzo email, ad esempio utilizzando SharedPreferences, quando invii l'email di accesso. Quindi, utilizza questo indirizzo per completare la procedura. Non trasmettere l'indirizzo email dell'utente nei parametri dell'URL di reindirizzamento e riutilizzarlo, in quanto ciò potrebbe consentire l'inserimento di sessioni.

Al termine dell'accesso, qualsiasi meccanismo di accesso precedente non verificato verrà rimosso dall'utente e tutte le sessioni esistenti verranno invalidate. Ad esempio, se in precedenza qualcuno ha creato un account non verificato con lo stesso indirizzo email e la stessa password, la password dell'utente verrà rimossa per impedire all' impostore che ha rivendicato la proprietà e creato l'account non verificato di accedere di nuovo con l'indirizzo email e la password non verificati.

Assicurati inoltre di utilizzare un URL HTTPS in produzione per evitare che il link venga potenzialmente intercettato da server intermedi.

Completare l'accesso in un'app Android

Firebase Authentication utilizza Firebase Hosting per inviare il link via email a un dispositivo mobile. Per completare l'accesso tramite l'applicazione mobile, l'applicazione deve essere configurata per rilevare il link dell'applicazione in entrata, analizzare il link diretto sottostante e quindi completare l'accesso. Per saperne di più, consulta la documentazione sui link dell'app Android.

Configurare Firebase Hosting

Firebase Authentication utilizza i domini Firebase Hosting quando crea e invia un link destinato all'apertura in un'applicazione mobile. È già stato configurato un dominio Firebase Hosting predefinito.

  1. Configura Firebase Hosting domini:

    Nella console Firebase, apri la sezione Hosting.

    • Se vuoi utilizzare il dominio predefinito per il link via email che si apre nelle applicazioni mobile, vai al sito predefinito e prendi nota del dominio Hosting predefinito. Un dominio Hosting predefinito in genere ha questo aspetto: questo: PROJECT_ID.firebaseapp.com.

      Questo valore ti servirà quando configurerai l'app per intercettare il link in entrata.

    • Se vuoi utilizzare un dominio personalizzato per il link via email, puoi registrarne uno con Firebase Hosting e utilizzarlo per il dominio del link.

  2. Configurare le applicazioni Android:

    Per gestire questi link dall'applicazione Android, il nome del pacchetto dell'app deve essere specificato nelle impostazioni del progetto della console Firebase.Firebase Inoltre, devono essere forniti l'SHA-1 e l'SHA-256 del certificato dell'applicazione.

    Se vuoi che questi link reindirizzino a un'attività specifica, devi configurare un filtro di intent nel file AndroidManifest.xml. Il filtro di intent deve intercettare i link via email del tuo dominio. In AndroidManifest.xml:

    <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.BROWSABLE" />
      <category android:name="android.intent.category.DEFAULT" />
      <data
        android:scheme="https"
        android:host="<PROJECT_ID>.firebaseapp.com or your custom domain"
        android:pathPrefix="/__/auth/links" />
    </intent-filter>
    

    Quando gli utenti aprono un link di hosting con il percorso /__/auth/links e lo schema e l'host che hai specificato, l'app avvierà l'attività con questo filtro di intent per gestire il link.

Dopo aver ricevuto il link come descritto sopra, verifica che sia destinato all'autenticazione tramite link via email e completa l'accesso.

Kotlin

val auth = Firebase.auth
val intent = intent
val emailLink = intent.data.toString()

// Confirm the link is a sign-in with email link.
if (auth.isSignInWithEmailLink(emailLink)) {
    // Retrieve this from wherever you stored it
    val email = "someemail@domain.com"

    // The client SDK will parse the code from the link for you.
    auth.signInWithEmailLink(email, emailLink)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "Successfully signed in with email link!")
                val result = task.result
                // You can access the new user via result.getUser()
                // Additional user info profile *not* available via:
                // result.getAdditionalUserInfo().getProfile() == null
                // You can check if the user is new or existing:
                // result.getAdditionalUserInfo().isNewUser()
            } else {
                Log.e(TAG, "Error signing in with email link", task.exception)
            }
        }
}

Java

FirebaseAuth auth = FirebaseAuth.getInstance();
Intent intent = getIntent();
String emailLink = intent.getData().toString();

// Confirm the link is a sign-in with email link.
if (auth.isSignInWithEmailLink(emailLink)) {
    // Retrieve this from wherever you stored it
    String email = "someemail@domain.com";

    // The client SDK will parse the code from the link for you.
    auth.signInWithEmailLink(email, emailLink)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Successfully signed in with email link!");
                        AuthResult result = task.getResult();
                        // You can access the new user via result.getUser()
                        // Additional user info profile *not* available via:
                        // result.getAdditionalUserInfo().getProfile() == null
                        // You can check if the user is new or existing:
                        // result.getAdditionalUserInfo().isNewUser()
                    } else {
                        Log.e(TAG, "Error signing in with email link", task.getException());
                    }
                }
            });
}

Per saperne di più su come gestire l'accesso tramite link via email in un'applicazione Apple, consulta la guida per le piattaforme Apple.

Per scoprire come gestire l'accesso tramite link via email in un'applicazione web, consulta la guida per il web.

Puoi anche collegare questo metodo di autenticazione a un utente esistente. Ad esempio un utente autenticato in precedenza con un altro provider, ad esempio un numero di telefono, può aggiungere questo metodo di accesso al suo account esistente.

La differenza si trova nella seconda metà dell'operazione:

Kotlin

// Construct the email link credential from the current URL.
val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink)

// Link the credential to the current user.
Firebase.auth.currentUser!!.linkWithCredential(credential)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d(TAG, "Successfully linked emailLink credential!")
            val result = task.result
            // You can access the new user via result.getUser()
            // Additional user info profile *not* available via:
            // result.getAdditionalUserInfo().getProfile() == null
            // You can check if the user is new or existing:
            // result.getAdditionalUserInfo().isNewUser()
        } else {
            Log.e(TAG, "Error linking emailLink credential", task.exception)
        }
    }

Java

// Construct the email link credential from the current URL.
AuthCredential credential =
        EmailAuthProvider.getCredentialWithLink(email, emailLink);

// Link the credential to the current user.
auth.getCurrentUser().linkWithCredential(credential)
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "Successfully linked emailLink credential!");
                    AuthResult result = task.getResult();
                    // You can access the new user via result.getUser()
                    // Additional user info profile *not* available via:
                    // result.getAdditionalUserInfo().getProfile() == null
                    // You can check if the user is new or existing:
                    // result.getAdditionalUserInfo().isNewUser()
                } else {
                    Log.e(TAG, "Error linking emailLink credential", task.getException());
                }
            }
        });

Questa opzione può essere utilizzata anche per riautenticare un utente con link via email prima di eseguire un operazione sensibile.

Kotlin

// Construct the email link credential from the current URL.
val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink)

// Re-authenticate the user with this credential.
Firebase.auth.currentUser!!.reauthenticateAndRetrieveData(credential)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            // User is now successfully reauthenticated
        } else {
            Log.e(TAG, "Error reauthenticating", task.exception)
        }
    }

Java

// Construct the email link credential from the current URL.
AuthCredential credential =
        EmailAuthProvider.getCredentialWithLink(email, emailLink);

// Re-authenticate the user with this credential.
auth.getCurrentUser().reauthenticateAndRetrieveData(credential)
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // User is now successfully reauthenticated
                } else {
                    Log.e(TAG, "Error reauthenticating", task.getException());
                }
            }
        });

Tuttavia, poiché la procedura potrebbe terminare su un dispositivo diverso in cui l'utente originale non ha eseguito l'accesso, questa procedura potrebbe non essere completata. In questo caso, all'utente può essere mostrato un errore per forzarlo ad aprire il link sullo stesso dispositivo. Nello stato del link possono essere trasmesse informazioni sul tipo di operazione e sull'UID utente.

In precedenza, l'autenticazione tramite link via email si basava su Firebase Dynamic Links, che verrà ritirato il 25 agosto 2025.

Abbiamo pubblicato una soluzione alternativa nell'Firebase Authentication SDK per Android v23.2.0+ e nella distinta base di Firebase Firebase BoM v33.9.0+.

Se la tua app utilizza i link in stile precedente, devi eseguire la migrazione dell'app al nuovo sistema basato su Firebase Hosting.

Se hai creato il progetto a partire dal 15 settembre 2023, la protezione da enumerazione email è attivata per impostazione predefinita. Questa funzionalità migliora la sicurezza degli account utente del progetto, ma disattiva il fetchSignInMethodsForEmail() metodo, che in precedenza consigliavamo di implementare per le procedure di identificazione.

Sebbene tu possa disattivare la protezione da enumerazione email per il tuo progetto, ti sconsigliamo di farlo.

Per ulteriori dettagli, consulta la documentazione sulla protezione da enumerazione email.

Passaggi successivi

Dopo che un utente ha eseguito l'accesso per la prima volta, viene creato un nuovo account utente e collegato alle credenziali, ovvero al nome utente e alla password, al numero di telefono o alle informazioni del provider di autenticazione con cui l'utente ha eseguito l'accesso. Questo nuovo account viene memorizzato come parte del progetto Firebase e può essere utilizzato per identificare un utente in ogni app del progetto, indipendentemente dalla modalità di accesso.

  • Nelle tue app, puoi ottenere le informazioni di base del profilo dell'utente dall' FirebaseUser oggetto. Consulta Gestire gli utenti.

  • Nelle regole di sicurezza di Firebase Realtime Database e Cloud Storage , puoi ottenere l'ID utente univoco dell'utente che ha eseguito l'accesso dalla variabile auth, e utilizzarlo per controllare i dati a cui un utente può accedere.

Puoi consentire agli utenti di accedere alla tua app utilizzando più provider di autenticazione collegando le credenziali del provider di autenticazione a un account utente esistente.

Per disconnettere un utente, chiama signOut:

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();