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

Puoi utilizzare Firebase Authentication per far accedere un utente inviandogli un'email contenente un link su cui possono fare clic per accedere. Durante la procedura, l'utente dell'indirizzo email sia verificato.

L'accesso via email offre numerosi vantaggi:

  • Registrazione e accesso senza problemi.
  • Minore rischio di riutilizzo della password nelle applicazioni, con un conseguente rischio di compromissione della sicurezza di 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 l'utente che ha dimenticato la password può comunque accedere senza dover reimpostare la password.

Prima di iniziare

Usa Swift Package Manager per installare e gestire le dipendenze di Firebase.

  1. In Xcode, con il progetto dell'app aperto, vai a File > Aggiungi pacchetti.
  2. Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Scegli la libreria Firebase Authentication.
  5. Aggiungi il flag -ObjC alla sezione Altri flag 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 Autorizzazione.
  2. 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.
  3. Nella stessa sezione, attiva l'accesso Invia email tramite link (accesso senza password). .
  4. Fai clic su Salva.

Per avviare il flusso di autenticazione, presenta all'utente un'interfaccia che lo invita a fornire il proprio indirizzo email, quindi chiama sendSignInLink per richiedere a Firebase di inviare il link di autenticazione all'indirizzo email dell'utente.

  1. Crea l'oggetto ActionCodeSettings, che fornisce a Firebase istruzioni su come creare il link nell'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).
    • iOSBundleID e androidPackageName : le app da utilizzare quando viene fornito il link di accesso è aperta 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 essere sempre completate nell'app a differenza di altre azioni fuori dal campo delle email (password reimpostazione e verifiche email). Questo perché, alla fine del flusso, se l'utente deve aver effettuato l'accesso e il suo stato di autorizzazione persiste l'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. example.page.link). In caso contrario, viene selezionato automaticamente il primo dominio.

    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 Passare 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 salvalo nel caso in cui l'utente completi l'accesso via 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 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 venga eseguito correttamente, questo indirizzo email deve corrispondere all'indirizzo a cui è stato originariamente inviato il link di accesso.

Puoi semplificare questo flusso per gli utenti che aprono il link di accesso sullo stesso dispositivo su cui viene richiesto il collegamento, memorizzando il loro indirizzo email localmente quando invia l'email di accesso. Poi, utilizza questo indirizzo per completare la procedura.

Una volta completato l'accesso, qualsiasi meccanismo precedente non verificato di accesso sarà rimosso dall'utente e le eventuali sessioni esistenti verranno invalidate. Ad esempio, se un utente ha creato in precedenza un account non verificato con lo stesso email e password, la password dell'utente verrà rimossa per impedire utente che ha rivendicato la proprietà e creato l'account non verificato di accedendo di nuovo con lo stesso account.

Completare l'accesso in un'app mobile Apple

Firebase Authentication utilizza Firebase Dynamic Links 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.

Firebase Auth utilizza Firebase Dynamic Links per l'invio di una che deve essere aperto in un'applicazione mobile. Per utilizzare questa funzionalità, i link dinamici devono essere configurati nella console di Firebase.

  1. Attiva Firebase Dynamic Links:

    1. Nella console Firebase, apri la sezione Dynamic Links.
    2. 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.

  2. Configurazione delle applicazioni Apple:

    1. Se prevedi di gestire questi link dalla tua applicazione, L'ID pacchetto deve essere specificato nella console Firebase impostazioni progetto. Inoltre, l'ID App Store e l'ID Apple Developer È necessario specificare anche l'ID team.
    2. Devi inoltre configurare il dominio del gestore delle azioni email come Dominio associato nelle funzionalità dell'applicazione. Per impostazione predefinita, il gestore delle azioni email è ospitato su un dominio come nell'esempio seguente:
      APP_ID.firebaseapp.com
    3. Se prevedi di distribuire la tua applicazione a iOS 8 e versioni precedenti, devi impostare l'ID pacchetto come schema personalizzato per le URL.
    4. Per saperne di più, consulta Ricezione delle istruzioni per i link dinamici della piattaforma Apple.

Dopo aver ricevuto il link come descritto in precedenza, verifica che sia destinato all'email l'autenticazione del link 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 il link 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 si è autenticato in precedenza con un altro provider, ad esempio un numero di telefono, possono aggiungere questo metodo di accesso al proprio account esistente.

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

Questo può essere utilizzato anche per autenticare di nuovo un utente del link email prima di eseguire una per 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, il flusso potrebbe terminare su un dispositivo diverso su cui l'utente originale non è stato eseguito l'accesso, questo flusso potrebbe non essere stato completato. In questo caso, un errore può per costringerlo ad aprire il link sullo stesso dispositivo. Alcune lo stato desiderato può essere passato nel link per fornire informazioni sul tipo di operazione e l'uid dell'utente.

Se hai creato il progetto a partire dal 15 settembre 2023, la protezione dall'enumerazione email è attiva per impostazione predefinita. Questa funzione migliora la sicurezza account utente del progetto, ma disabilita fetchSignInMethodsForEmail() che in precedenza abbiamo consigliato per implementare i flussi Identifier-First.

Anche se puoi disabilitare la protezione dall'enumerazione delle email per il tuo progetto, sconsigliamo 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 ottenere le informazioni di base del profilo dell'utente dal User . Vedi Gestire gli utenti.

  • In Firebase Realtime Database e Cloud Storage Regole di sicurezza, puoi ottieni l'ID utente unico dell'utente che ha eseguito l'accesso dalla variabile auth e usarli 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:.

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 il codice per la gestione degli errori per l'intero intervallo di autenticazione errori. Vedi Gestire gli errori.