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, il che può compromettere la sicurezza anche di password ben selezionate.
- 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
Utilizza Swift Package Manager per installare e gestire le dipendenze di Firebase.
- In Xcode, con il progetto dell'app aperto, vai a File > Add Packages (File > Aggiungi pacchetti).
- Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple di Firebase:
- Scegli la Firebase Authentication libreria.
- Aggiungi il flag
-ObjCalla sezione Other Linker Flags (Altri flag del linker) delle impostazioni di compilazione della destinazione. - Al termine, Xcode inizierà automaticamente a risolvere e a scaricare le tue dipendenze in background.
https://github.com/firebase/firebase-ios-sdk.git
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 tuo progetto Firebase:
- Nella console Firebase, apri la sezione Autenticazione.
- 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.
Inviare un link di autenticazione all'indirizzo email dell'utente
Per avviare la procedura di autenticazione, mostra all'utente un'interfaccia che gli chiede di fornire il suo indirizzo email, quindi chiama sendSignInLink 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 inserito nella lista consentita dei domini autorizzati nella console Firebase, che si trova nella scheda Metodo di accesso (Autenticazione -> Metodo di accesso).
iOSBundleIDeandroidPackageName: aiutano Firebase Authentication a determinare se deve creare un link solo web o un link mobile che viene aperto su un dispositivo Android o Apple.handleCodeInApp: impostalo su true. L'operazione di accesso deve essere sempre completata nell'app, a differenza di altre azioni email fuori banda (reimpostazione 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 vengono definiti domini di link personalizzati per un progetto, 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, ).HostingPROJECT_ID.firebaseapp.comdynamicLinkDomain: deprecato. Non specificare questo parametro.
Swift
let actionCodeSettings = ActionCodeSettings() actionCodeSettings.url = URL(string: "https://www.example.com") // The sign-in operation has to always be completed in the app. actionCodeSettings.handleCodeInApp = true actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!) actionCodeSettings.setAndroidPackageName("com.example.android", installIfNotAvailable: false, minimumVersion: "12")
Objective-C
FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init]; [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]]; // The sign-in operation has to always be completed in the app. actionCodeSettings.handleCodeInApp = YES; [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]]; [actionCodeSettings setAndroidPackageName:@"com.example.android" installIfNotAvailable:NO minimumVersion:@"12"];
Per saperne di più su
ActionCodeSettings, consulta la sezione Trasmettere lo stato nelle azioni email.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 tramite email sullo stesso dispositivo.
Swift
Auth.auth().sendSignInLink(toEmail: email, actionCodeSettings: actionCodeSettings) { error in // ... if let error = error { self.showMessagePrompt(error.localizedDescription) return } // The link was successfully sent. Inform the user. // Save the email locally so you don't need to ask the user for it again // if they open the link on the same device. UserDefaults.standard.set(email, forKey: "Email") self.showMessagePrompt("Check your email for link") // ... }
Objective-C
[[FIRAuth auth] sendSignInLinkToEmail:email actionCodeSettings:actionCodeSettings completion:^(NSError *_Nullable error) { // ... if (error) { [self showMessagePrompt:error.localizedDescription]; return; } // The link was successfully sent. Inform the user. // Save the email locally so you don't need to ask the user for it again // if they open the link on the same device. [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"]; [self showMessagePrompt:@"Check your email for link"]; // ... }];
Completare 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 quando invii l'email di accesso. Quindi, utilizza questo indirizzo per completare la procedura.
Una volta completato l'accesso, qualsiasi meccanismo di accesso non verificato precedente verrà rimosso dall'utente e tutte le sessioni esistenti verranno invalidate. Ad esempio, se in precedenza qualcuno ha creato un account non verificato con la stessa email e 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 lo stesso account.
Completare l'accesso in un'app mobile Apple
Firebase Authentication utilizza Firebase Hosting per inviare il link via email a un dispositivo mobile. Per completare l'accesso con un'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 maggiori dettagli su come eseguire questa operazione, consulta la sezione sui link universali e sui domini associati su iOS.
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.
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:
.PROJECT_ID.firebaseapp.comQuesto 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.
Configurare le applicazioni Apple:
Dovrai configurare il dominio scelto come Dominio associato per gli app link. Per configurare l'autorizzazione nella tua app, apri la scheda Signing & Capabilities (Firma e funzionalità) della destinazione in Xcode e aggiungi i domini di Firebase Hosting del passaggio precedente alla funzionalità Domini associati. Se utilizzi il dominio Firebase Hosting predefinito, sarà
.applinks:PROJECT_ID.firebaseapp.comPer maggiori informazioni, consulta la sezione Supportare i domini associati nel sito della documentazione di Apple.
Verificare il link e accedere
Dopo aver ricevuto il link come descritto sopra, verifica che sia destinato all'autenticazione tramite link via email e completa l'accesso.
Swift
if Auth.auth().isSignIn(withEmailLink: link) { Auth.auth().signIn(withEmail: email, link: self.link) { user, error in // ... } }
Objective-C
if ([[FIRAuth auth] isSignInWithEmailLink:link]) { [[FIRAuth auth] signInWithEmail:email link:link completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { // ... }]; }
Per scoprire come gestire l'accesso tramite link via email in un'applicazione Android, consulta la guida per Android.
Per scoprire come gestire l'accesso tramite link via email in un'applicazione web, consulta la guida per il web.
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:
Swift
let credential = EmailAuthCredential.credential(withEmail:email link:link) Auth.auth().currentUser?.link(with: credential) { authData, error in if (error) { // And error occurred during linking. return } // The provider was successfully linked. // The phone user can now sign in with their phone number or email. }
Objective-C
FIRAuthCredential *credential = [FIREmailAuthProvider credentialWithEmail:email link:link]; [FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult *_Nullable result, NSError *_Nullable error) { if (error) { // And error occurred during linking. return; } // The provider was successfully linked. // The phone user can now sign in with their phone number or email. }];
Questa operazione può essere utilizzata anche per riautenticare un utente con link via email prima di eseguire un'operazione sensibile.
Swift
let credential = EmailAuthProvider.credential(withEmail:email link:link) Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in if (error) { // And error occurred during re-authentication. return } // The user was successfully re-authenticated. }
Objective-C
FIRAuthCredential *credential = [FIREmailAuthCredential credentialWithEmail:email link:link]; [FIRAuth auth].currentUser reauthenticateWithCredential:credential completion:^(FIRAuthDataResult *_Nullable result, NSError *_Nullable error) { if (error) { // And error occurred during re-authentication return; } // The user was successfully re-authenticated. }];
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, è possibile mostrare all'utente un errore per forzarlo ad aprire il link sullo stesso dispositivo. È possibile trasmettere alcuni stati nel link per fornire informazioni sul tipo di operazione e sull'UID utente.
Deprecato: verifica basata su Firebase Dynamic Links
Prima dell'SDK iOS v11.8.0, la funzionalità di accesso tramite link via email si basava su Firebase Dynamic Links per aprire i link di accesso nell'app corretta. Questi link di verifica sono deprecati, poiché Firebase Dynamic Links verrà ritirato il 25 agosto 2025.Firebase Authentication
Se la tua app utilizza i link in stile precedente, devi eseguire la migrazione dell'app al nuovo sistema basato su Firebase Hosting.
Deprecato: distinguere email-password da link via email
Se hai creato il tuo progetto il 15 settembre 2023 o dopo questa data, 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 saperne di più, consulta Attivare o disattivare la 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 tuo progetto Firebase e può essere utilizzato per identificare un utente in ogni app del tuo progetto, indipendentemente dalla modalità di accesso.
-
Nelle tue app, puoi ottenere le informazioni di base del profilo dell'utente dall'
Useroggetto. 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.
Per disconnettere un utente, chiama
signOut:.
Swift
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Objective-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
Potresti anche voler aggiungere codice di gestione degli errori per l'intera gamma di errori di autenticazione. Consulta Gestire gli errori.