Puoi utilizzare Firebase Authentication per far accedere un utente 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 via email offre numerosi vantaggi:
- Registrazione e accesso senza problemi.
- Ridurre il rischio di riutilizzo delle password tra le applicazioni, il che può minare la sicurezza anche delle password ben selezionate.
- La possibilità di autenticare un utente e di verificare al contempo che sia il proprietario legittimo di un indirizzo email.
- Per accedere, un utente ha bisogno solo di un account email accessibile. Non è richiesta la proprietà di un numero di telefono o di un account di social media.
- Un utente può accedere in sicurezza senza dover fornire (o ricordare) una password, il che può essere complicato su un dispositivo mobile.
- Per un utente esistente che in precedenza ha eseguito l'accesso con un identificatore email (password o federato), è possibile eseguire l'upgrade in modo che possa 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
Se non l'hai già fatto, aggiungi Firebase al tuo progetto Android.
Nel file Gradle del modulo (a livello di app) (di solito
<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 Firebase Android BoM per controllare la gestione delle versioni delle librerie.Inoltre, durante la 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:33.7.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.3.0") }Con Firebase Android BoM, la tua app utilizzerà sempre versioni compatibili delle librerie Firebase per Android.
(Alternativa) Aggiungi le dipendenze della libreria Firebase senza utilizzare il file BoM
Se scegli di non utilizzare Firebase BoM, devi specificare ogni versione della libreria Firebase nella relativa riga di dipendenza.
Tieni presente che se nella tua app utilizzi più librerie Firebase, ti consigliamo vivamente di utilizzare BoM per gestire le versioni delle librerie, in modo da garantire la compatibilità di tutte le versioni.
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:23.1.0")
// Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.3.0") }
Attivare l'accesso con link email per il progetto Firebase
Per consentire agli utenti di accedere tramite link email, devi prima attivare il provider email e il metodo di accesso tramite link email per il tuo progetto Firebase:
- Nella console Firebase, apri la sezione Auth.
- Nella scheda Metodo di accesso, attiva il provider Email/Password. Tieni presente che per utilizzare l'accesso tramite link email è necessario attivare l'accesso tramite email/password.
- Nella stessa sezione, attiva il metodo di accesso Link via email (accesso senza password).
- Fai clic su Salva.
Invia un link di autenticazione all'indirizzo email dell'utente
Per avviare il flusso di autenticazione, presenta all'utente un'interfaccia che lo invita a fornire il proprio indirizzo email, quindi chiama sendSignInLinkToEmail
per richiedere a Firebase di inviare il link di autenticazione all'indirizzo email dell'utente.
Costruisci l'oggetto ActionCodeSettings, che fornisce a Firebase le istruzioni su come creare il link 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 nell'elenco dei domini autorizzati della Console di Firebase, 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
eIOSBundleId
: le app da utilizzare quando il link di accesso viene aperto su un dispositivo Android o Apple. Scopri di più su come configurare Firebase Dynamic Links per aprire i link alle azioni email tramite app mobile.handleCodeInApp
: impostato su true. L'operazione di accesso deve sempre essere completata nell'app, a differenza di altre azioni via email out of band (reimpostazione della password e verifiche email). Questo perché, al termine del flusso, si presume che l'utente abbia eseguito l'accesso e che il suo stato di autenticazione sia stato mantenuto all'interno dell'app.dynamicLinkDomain
: quando sono definiti più domini di link dinamici personalizzati per un progetto, specifica quello da utilizzare quando il link deve essere aperto tramite un'app mobile specificata (ad es.dynamicLinkDomain
). In caso contrario, viene selezionato automaticamente il primo dominio.example.page.link
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 Passare lo stato nelle azioni email.
Chiedi all'utente il suo indirizzo email.
Invia il link di autenticazione all'indirizzo email dell'utente e salvalo nel caso in cui l'utente completi l'accesso via 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."); } } });
Completare l'accesso con il link email
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 Auth richiede di fornire l'indirizzo email dell'utente al termine del flusso di accesso. Affinché l'accesso vada a buon fine, questo indirizzo email deve corrispondere a quello a cui è stato inviato originariamente il link di accesso.
Puoi semplificare questo flusso per gli utenti che aprono il link di accesso sullo stesso dispositivo su cui lo richiedono, memorizzando il loro indirizzo email localmente, ad esempio utilizzando SharedPreferences, quando invii l'email di accesso. Poi, utilizza questo indirizzo per completare la procedura. Non passare l'email dell'utente nei parametri dell'URL di reindirizzamento e riutilizzarla, poiché questo potrebbe consentire le iniezioni di sessione.
Al termine dell'accesso, qualsiasi meccanismo di accesso non verificato precedente verrà rimosso dall'utente e le sessioni esistenti verranno invalidate. Ad esempio, se qualcuno ha creato in precedenza un account non verificato con la stessa email e la stessa password, la password dell'utente verrà rimossa per impedire all'usurpatore che ha rivendicato la proprietà e creato l'account non verificato di accedere di nuovo con l'email e la password non verificate.
Inoltre, assicurati di utilizzare un URL HTTPS in produzione per evitare che il link venga potentially intercettato da server intermedi.
Completare l'accesso in un'app per Android
Firebase Authentication utilizza i link dinamici Firebase per inviare il link 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 arrivo, analizzare il link diretto sottostante e completare l'accesso.
Configurazione di Firebase Dynamic Links
Firebase Auth utilizza Firebase Dynamic Links quando invia un link che deve essere aperto in un'applicazione mobile. Per utilizzare questa funzionalità, è necessario configurare Dynamic Links nella console di Firebase.
Attiva Firebase Dynamic Links:
- Nella console Firebase, apri la sezione Dynamic Links.
-
Se non hai ancora accettato i termini di Dynamic Links e creato un dominio Dynamic Links, fallo ora.
Se hai già creato un dominio Dynamic Links, prendine nota. Un dominio Dynamic Links è simile al seguente esempio:
example.page.link
Questo valore ti servirà quando configuri la tua app per Apple o Android in modo da intercettare il link in arrivo.
Configurazione delle applicazioni Android:
- Per gestire questi link dalla tua applicazione per Android, il nome del pacchetto Android deve essere specificato nelle impostazioni del progetto Firebase Console. Inoltre, devono essere forniti gli hash SHA-1 e SHA-256 del certificato dell'applicazione.
- Ora che hai aggiunto un dominio di link dinamico e hai verificato che la tua app per Android sia configurata correttamente, il link dinamico reindirizzerà alla tua applicazione, a partire dall'attività di avvio.
- Se vuoi che il link dinamico reindirizzi a un'attività specifica, dovrai configurare un filtro intent nel file AndroidManifest.xml. Puoi farlo specificando il dominio del link dinamico o il gestore dell'azione email nel filtro per intent. Per impostazione predefinita, l'handler di azioni email è ospitato su un dominio come nell'esempio seguente:
PROJECT_ID.firebaseapp.com/
- Limitazioni:
- Non specificare l'URL impostato su actionCodeSettings nel filtro intent.
- Quando hai creato il dominio del link dinamico, potresti aver creato anche un link con URL breve. Questo URL breve non verrà passato. Non
configurare il filtro per intent in modo da rilevarlo con un
attributo
android:pathPrefix
. Ciò significa che non potrai recuperare diversi link dinamici in parti diverse della tua applicazione. Tuttavia, puoi controllare il parametro di querymode
nel link per vedere quale operazione si sta tentando di eseguire o utilizzare metodi SDK comeisSignInWithEmailLink
per verificare se un link ricevuto dalla tua app fa ciò che vuoi.
- Per scoprire di più sulla ricezione dei link dinamici, consulta Istruzioni per la ricezione dei link dinamici Android.
Verifica il link e accedi
Dopo aver ricevuto il link come descritto sopra, verifica che sia destinato all'autenticazione tramite link 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 scoprire di più su come gestire l'accesso con il link email in un'applicazione Apple, consulta la guida alle piattaforme Apple.
Per scoprire come gestire l'accesso con il link email in un'applicazione web, consulta la guida web.
Collegamento/nuova autenticazione con link email
Puoi anche collegare questo metodo di autenticazione a un utente esistente. Ad esempio, un utente che si è autenticato in precedenza con un altro fornitore, ad esempio un numero di telefono, può aggiungere questo metodo di accesso al proprio 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()); } } });
Può essere utilizzato anche per autenticare di nuovo un utente con link 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é il flusso potrebbe terminare su un altro dispositivo su cui l'utente originale non ha eseguito l'accesso, questo flusso potrebbe non essere completato. In questo caso, all'utente può essere mostrato un messaggio di errore per costringerlo ad aprire il link sullo stesso dispositivo. Nel link è possibile passare un valore per fornire informazioni sul tipo di operazione e sull'UID dell'utente.
Ritiro: differenza tra email e password e link email
Se hai creato il progetto a partire dal 15 settembre 2023, la protezione dall'enumerazione email è attiva per impostazione predefinita. Questa funzionalità migliora la sicurezza degli account utente del progetto, ma disattiva il metodo fetchSignInMethodsForEmail()
, che in precedenza consigliavamo per implementare i flussi che danno la priorità all'identificatore.
Sebbene tu possa disattivare la protezione da enumerazione email per il tuo progetto, non ti consigliamo di farlo.
Per ulteriori dettagli, consulta la documentazione sulla protezione dall'enumerazione delle 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 nome utente e password, numero di telefono o informazioni del fornitore di autenticazione, con cui l'utente ha eseguito l'accesso. Questo nuovo account viene archiviato nel tuo progetto Firebase e può essere utilizzato per identificare un utente in tutte le app del progetto, indipendentemente da come accede.
-
Nelle tue app, puoi recuperare le informazioni di base del profilo dell'utente dall'oggetto
FirebaseUser
. Vedi Gestire gli utenti. Nelle Regole di sicurezza Firebase Realtime Database e Cloud Storage, puoi recuperare l'ID utente univoco dell'utente che ha eseguito l'accesso dalla variabile
auth
e utilizzarlo per controllare a quali dati può accedere un utente.
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 scollegare un utente, chiama
signOut
:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();