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 senza problemi.
- Rischio ridotto di riutilizzo delle password tra le applicazioni, che può compromettere la sicurezza anche delle password selezionate 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 è richiesta la proprietà di un numero di telefono o di un account social media.
- 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
Se non l'hai ancora fatto, segui i passaggi descritti nella guida Inizia.
Attiva l'accesso tramite link via email per il tuo 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 tuo progetto Firebase:
- Nella console Firebase, apri la sezione Auth.
- 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.
- 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 la procedura di autenticazione, presenta un'interfaccia che chiede all'utente di fornire il suo indirizzo email e poi 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 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 presente nell'elenco dei domini autorizzati della console Firebase, che si trova nella scheda Impostazioni (Autenticazione -> Impostazioni -> Domini autorizzati). Il link reindirizzerà l'utente a questo URL se l'app non è installata sul suo dispositivo e non è stato possibile installarla.androidPackageNameeIOSBundleId: le app da utilizzare quando il link di accesso viene aperto su un dispositivo Android o iOS. Scopri di più su come configurare Firebase Dynamic Links per aprire i link di azione via email tramite app mobile.handleCodeInApp: imposta sutrue. L'operazione di accesso deve essere sempre completata nell'app, a differenza di altre azioni via email fuori banda (reimpostazione password e verifica email). Questo perché, alla fine della procedura, l'utente deve aver eseguito l'accesso e il suo stato di autenticazione deve essere mantenuto all'interno dell'app.dynamicLinkDomain: (ritirato, utilizzalinkDomain) quando per un progetto sono definiti più domini di link dinamici personalizzati, specifica quale utilizzare quando il link deve essere aperto utilizzando un'app mobile specificata (ad esempio,example.page.link). In caso contrario, viene selezionato automaticamente il primo dominio.linkDomain: il dominio Firebase Hosting personalizzato facoltativo da utilizzare quando il link deve essere aperto utilizzando un'app mobile specificata. Il dominio deve essere configurato in Firebase Hosting e di proprietà del progetto. Non può essere un dominio Hosting predefinito (web.appofirebaseapp.com). Questa impostazione sostituisce l'impostazionedynamicLinkDomainritirata.
var acs = 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, iOSBundleId: 'com.example.ios', androidPackageName: 'com.example.android', // installIfNotAvailable androidInstallApp: true, // minimumVersion androidMinimumVersion: '12');Chiedi all'utente il suo indirizzo email.
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 via email sullo stesso dispositivo.
var emailAuth = 'someemail@domain.com'; FirebaseAuth.instance.sendSignInLinkToEmail( email: emailAuth, actionCodeSettings: acs) .catchError((onError) => print('Error sending email verification $onError')) .then((value) => print('Successfully sent email verification')); });
Completa l'accesso con il link via 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 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 il loro indirizzo email localmente, 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 riutilizzalo, in quanto ciò potrebbe consentire l'inserimento di sessioni.
Una volta completato l'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 intermediari.
Completa l'accesso
Firebase Dynamic Links è ritirato; ora viene utilizzato Firebase Hosting per inviare un link di accesso. Segui le guide per la configurazione specifica della piattaforma:
Verifica il link via email e accedi
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.
Nel gestore dei link, verifica se il link è destinato all'autenticazione tramite link via email e, in caso affermativo, completa la procedura di accesso.
// Confirm the link is a sign-in with email link. if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) { try { // The client SDK will parse the code from the link for you. final userCredential = await FirebaseAuth.instance .signInWithEmailLink(email: emailAuth, emailLink: emailLink); // You can access the new user via userCredential.user. final emailAddress = userCredential.user?.email; print('Successfully signed in with email link!'); } catch (error) { print('Error signing in with email link.'); } }
Collegamento/riautenticazione con link via email
Puoi anche collegare questo metodo di autenticazione a un utente esistente. Ad esempio, un utente che in precedenza ha eseguito l'autenticazione 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:
final authCredential = EmailAuthProvider
.credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
await FirebaseAuth.instance.currentUser
?.linkWithCredential(authCredential);
} catch (error) {
print("Error linking emailLink credential.");
}
Può essere utilizzato anche per riautenticare un utente con link via email prima di eseguire un'operazione sensibile.
final authCredential = EmailAuthProvider
.credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
await FirebaseAuth.instance.currentUser
?.reauthenticateWithCredential(authCredential);
} catch (error) {
print("Error reauthenticating credential.");
}
Tuttavia, poiché la procedura potrebbe terminare su un dispositivo diverso su 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.
Ritirato: distinzione tra email-password e link via email
Se hai creato il tuo 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 tuo progetto, ma disattiva il metodo fetchSignInMethodsForEmail(), 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 maggiori dettagli, consulta la documentazione sulla protezione da enumerazione email.
Passaggi successivi
Dopo che un utente ha creato un nuovo account, questo account viene memorizzato come parte del tuo progetto Firebase e può essere utilizzato per identificare un utente in ogni app del tuo progetto, indipendentemente dal metodo di accesso utilizzato dall'utente.
Nelle tue app, puoi ottenere le informazioni di base del profilo dell'utente dall'oggetto User. 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():
await FirebaseAuth.instance.signOut();