Eseguire l'autenticazione con Firebase utilizzando il collegamento email sulle piattaforme Apple

Puoi utilizzare Firebase Authentication per consentire l'accesso di 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 tramite email offre numerosi vantaggi:

  • Registrazione e accesso senza problemi.
  • Minore rischio di riutilizzo delle password nelle applicazioni, il che può compromettere la sicurezza anche di password ben selezionate.
  • La possibilità di autenticare un utente e 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 di 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 ha eseguito l'accesso in precedenza 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.

  1. In Xcode, con il progetto dell'app aperto, vai a File > Add Packages (File > Aggiungi pacchetti).
  2. Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple di Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Scegli la raccolta Firebase Authentication.
  5. Aggiungi il flag -ObjC alla sezione Altri flag del linker delle impostazioni di build del target.
  6. Al termine, Xcode inizierà automaticamente a risolvere e a scaricare le tue dipendenze in background.

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:

  1. Nella console Firebase, apri la sezione Autenticazione.
  2. Nella scheda Metodo di accesso, attiva il provider Email/Password. Tieni presente che l'accesso con email/password deve essere attivato per utilizzare l'accesso con 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 il flusso di autenticazione, mostra all'utente un'interfaccia che gli chiede di fornire il proprio indirizzo email e poi chiama sendSignInLink per richiedere a Firebase di inviare il link di autenticazione all'indirizzo email dell'utente.

  1. Costruisci l'oggetto ActionCodeSettings, che fornisce a Firebase le istruzioni su come costruire 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 dei domini autorizzati nella console Firebase, che puoi trovare nella scheda Metodo di accesso (Autenticazione -> Metodo di accesso).
    • iOSBundleID e androidPackageName: 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 via email fuori banda (reimpostazione password e verifiche email). Questo perché, alla fine del flusso, l'utente deve aver eseguito l'accesso e il suo stato di autenticazione deve essere mantenuto all'interno dell'app.
    • linkDomain: quando per un progetto vengono definiti domini di link Hosting personalizzati, specifica quale utilizzare quando il link deve essere aperto da un'app mobile specificata. In caso contrario, il dominio predefinito viene selezionato automaticamente (ad esempio, PROJECT_ID.firebaseapp.com).
    • dynamicLinkDomain: 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 Trasferimento dello stato nelle azioni email.

  2. Chiedi all'utente il suo indirizzo email.

  3. Invia il link di autenticazione all'email dell'utente e salva l'indirizzo email nel caso in cui l'utente completi l'accesso con l'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"];
        // ...
    }];

Problemi di sicurezza

Per impedire che un link di accesso venga utilizzato per accedere come utente non intenzionale o su un dispositivo non intenzionale, Firebase Auth richiede che l'indirizzo email dell'utente venga fornito al termine del flusso di accesso. Per accedere correttamente, 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 quando invii l'email di accesso. Quindi, utilizza questo indirizzo per completare il flusso.

Al termine dell'accesso, qualsiasi meccanismo di accesso precedente non verificato verrà rimosso dall'utente e le sessioni esistenti verranno invalidate. Ad esempio, se qualcuno ha creato in precedenza 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 lo stesso account.

Completare l'accesso in un'app mobile Apple

Firebase Authentication utilizza Firebase Hosting per inviare il link dell'email a un dispositivo mobile. Per il completamento dell'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 ulteriori dettagli su come eseguire questa operazione, consulta l'articolo sui link universali e sui domini associati su iOS.

Configura Firebase Hosting

Firebase Authentication utilizza i domini Firebase Hosting quando crea e invia un link che deve essere aperto in un'applicazione mobile. È già stato configurato per te un dominio Firebase Hosting predefinito.

  1. Configura i domini Firebase Hosting:

    Nella console Firebase, apri la sezione Hosting.

    • Se vuoi utilizzare il dominio predefinito per il link email che si apre nelle applicazioni mobile, vai al tuo sito predefinito e prendi nota del tuo dominio Hosting predefinito. Un dominio Hosting predefinito in genere ha questo aspetto: 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 email, puoi registrarne uno con Firebase Hosting e utilizzarlo per il dominio del link.

  2. Configurazione delle applicazioni Apple:

    Dovrai configurare il dominio scelto come Dominio associato per i link per app. Per configurare il diritto nella tua app, apri la scheda Firma e funzionalità del target in Xcode e aggiungi i domini di Firebase Hosting dal passaggio precedente alla funzionalità Domini associati. Se utilizzi il dominio Firebase Hosting predefinito, questo sarà applinks:PROJECT_ID.firebaseapp.com.

    Per saperne di più, consulta la sezione Supporto dei domini associati sul sito di documentazione di Apple.

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 con link via email in un'applicazione Android, consulta la guida per Android.

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

Puoi anche collegare questo metodo di autenticazione a un utente esistente. Ad esempio, un utente che in precedenza si è autenticato con un altro provider, 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:

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.
  }];

Può essere utilizzato anche per eseguire nuovamente l'autenticazione di un utente con link 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é il flusso potrebbe terminare su un dispositivo diverso in cui l'utente originale non ha eseguito l'accesso, questo flusso potrebbe non essere completato. In questo caso, all'utente può essere mostrato un errore per forzarlo ad aprire il link sullo stesso dispositivo. Alcuni stati possono essere passati nel link per fornire informazioni sul tipo di operazione e sull'UID utente.

Prima dell'Firebase AuthenticationSDK iOS v11.8.0, la funzionalità di accesso tramite link email si basava su Firebase Dynamic Links per aprire i link di accesso nell'app corretta. Questi link di verifica sono ritirati, in quanto Firebase Dynamic Links verrà chiuso il 25 agosto 2025.

Se la tua app utilizza i link nel vecchio stile, devi migrare l'app al nuovo sistema basato su Firebase Hosting.

Se hai creato il progetto a partire dal 15 settembre 2023, la protezione dall'enumerazione delle email è abilitata 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 i flussi incentrati sull'identificatore.

Anche se puoi disattivare la protezione dall'enumerazione email per il tuo progetto, ti sconsigliamo di farlo.

Per saperne di più, vedi Attivare o disattivare la 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 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'oggetto User . Vedi 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 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 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 aggiungere un codice di gestione degli errori per l'intera gamma di errori di autenticazione. Consulta la sezione Gestisci gli errori.