Google 致力于为黑人社区推动种族平等。查看具体举措

Autenticazione con Firebase utilizzando il collegamento e-mail in iOS

Puoi utilizzare l'autenticazione Firebase per accedere a un utente inviandogli un'e-mail contenente un collegamento, su cui possono fare clic per accedere. Nel processo, viene verificato anche l'indirizzo e-mail dell'utente.

L'accesso tramite e-mail offre numerosi vantaggi:

  • Registrazione e accesso a basso attrito.
  • Rischio inferiore di riutilizzo delle password tra le applicazioni, che può compromettere la sicurezza anche di password ben selezionate.
  • La possibilità di autenticare un utente verificando anche che l'utente sia il legittimo proprietario di un indirizzo email.
  • Un utente ha bisogno solo di un account e-mail accessibile per accedere. Non è richiesta la proprietà di un numero di telefono o di un account di social media.
  • Un utente può accedere in modo sicuro senza la necessità di fornire (o ricordare) una password, che può essere scomoda su un dispositivo mobile.
  • Un utente esistente che ha effettuato l'accesso in precedenza con un identificatore e-mail (password o federato) può essere aggiornato per accedere solo con l'e-mail. Ad esempio, un utente che ha dimenticato la password può comunque accedere senza dover reimpostare la password.

Prima di iniziare

  1. Aggiungere Firebase al progetto iOS .

  2. Includere i seguenti baccelli nel Podfile :

    pod 'Firebase/Auth'
    

  3. Se non hai ancora collegato l'app per il vostro progetto Firebase, farlo dalla console Firebase .

Per accedere agli utenti tramite collegamento e-mail, devi prima abilitare il provider di posta elettronica e il metodo di accesso tramite collegamento e-mail per il tuo progetto Firebase:

  1. Nella console Firebase , aprire la sezione Auth.
  2. Sul segno nella scheda Metodo, abilitare il provider e-mail / password. Tieni presente che l'accesso tramite e-mail/password deve essere abilitato per utilizzare l'accesso tramite collegamento e-mail.
  3. Nella stessa sezione, abilitare Link E-mail (senza password di accesso) Metodo di accesso.
  4. Fare clic su Salva.

Per avviare il flusso di autenticazione, presentare all'utente un'interfaccia che richiede all'utente di fornire il proprio indirizzo email e quindi chiamare sendSignInLinkToEmail:actionCodeSettings:completion: alla richiesta che Firebase inviare il link di autenticazione per e-mail dell'utente.

  1. Costruire l' ActionCodeSettings oggetto, che fornisce Firebase con le istruzioni su come costruire il collegamento e-mail. Imposta i seguenti campi:

    • url: il collegamento diretto da incorporare e qualsiasi stato aggiuntivo da trasmettere. Il dominio del collegamento deve essere inserito nella whitelist nell'elenco dei domini autorizzati di Firebase Console, che può essere trovato accedendo alla scheda Metodo di accesso (Autenticazione -> Metodo di accesso).
    • iOSBundleID e androidPackageName : le app da usare quando il collegamento di accesso viene aperto su un dispositivo Android o iOS. Per saperne di più su come configurare Firebase dinamico Link per aprire i link di azione e-mail tramite applicazioni mobili.
    • handleCodeInApp: impostato su true. L'operazione di accesso deve essere sempre completata nell'app a differenza di altre azioni e-mail fuori banda (reimpostazione password e verifiche e-mail). Ciò è dovuto al fatto che, alla fine del flusso, è previsto che l'utente abbia effettuato l'accesso e che il suo stato di autenticazione persista all'interno dell'app.
    • dynamicLinkDomain: Quando più domini collegamento dinamico personalizzato sono definiti per un progetto, specificare quale usare quando il collegamento deve essere aperto tramite un app mobile specificato (ad esempio, example.page.link ). Altrimenti 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")
    

    Obiettivo-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, fare riferimento alla Stato Passando Email Azioni sezione.

  2. Chiedi all'utente la sua email.

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

    Obiettivo-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 evitare che un link di accesso venga utilizzato per accedere come utente indesiderato o su un dispositivo indesiderato, Firebase Auth richiede che venga fornito l'indirizzo email dell'utente durante il completamento del flusso di accesso. Affinché l'accesso abbia esito positivo, questo indirizzo di posta elettronica deve corrispondere all'indirizzo a cui è stato originariamente inviato il collegamento di accesso.

Puoi semplificare questo flusso per gli utenti che aprono il collegamento di accesso sullo stesso dispositivo in cui richiedono il collegamento, memorizzando il loro indirizzo di posta elettronica localmente quando invii il messaggio di posta elettronica di accesso. Quindi, usa questo indirizzo per completare il flusso.

Dopo il completamento dell'accesso, qualsiasi precedente meccanismo di accesso non verificato verrà rimosso dall'utente e tutte le sessioni esistenti verranno invalidate. Ad esempio, se qualcuno ha creato in precedenza un account non verificato con la stessa email e password, la password dell'utente verrà rimossa per impedire al sosia che ha rivendicato la proprietà e ha creato l'account non verificato di accedere nuovamente con lo stesso account.

Completamento dell'accesso in un'app mobile iOS

L'autenticazione Firebase utilizza i collegamenti dinamici Firebase per inviare il collegamento e-mail a un dispositivo mobile. Per completare l'accesso tramite l'applicazione mobile, l'applicazione deve essere configurata per rilevare il collegamento dell'applicazione in entrata, analizzare il collegamento diretto sottostante e quindi completare l'accesso.

Firebase Auth utilizza Firebase dinamica collegamenti durante l'invio di un collegamento che è destinato ad essere aperto in applicazioni mobili. Per utilizzare questa funzione, i collegamenti dinamici devono essere configurati nella console Firebase.

  1. Abilita collegamenti dinamici Firebase:

    1. Nella console Firebase , aprire la sezione dinamica Links.
    2. Se non hai ancora accettato i termini di Dynamic Links e hai creato un dominio Dynamic Links, fallo ora.

      Se hai già creato un dominio Dynamic Links, prendine nota. Un dominio Dynamic Links in genere ha l'aspetto del seguente esempio:

      example.page.link

      Avrai bisogno di questo valore quando configuri la tua app iOS o Android per intercettare il collegamento in entrata.

  2. Configurazione delle applicazioni iOS:

    1. Se prevedi di gestire questi link dalla tua applicazione iOS, l'ID bundle iOS deve essere specificato nelle impostazioni del progetto Firebase Console. Inoltre, è necessario specificare anche l'ID dell'App Store e l'ID del team di sviluppatori Apple.
    2. Dovrai anche configurare il dominio del gestore di azioni e-mail come Dominio associato nelle funzionalità dell'applicazione. Per impostazione predefinita, il gestore di azione e-mail è ospitato su un dominio simile al seguente esempio:
      APP_ID.firebaseapp.com
    3. Se prevedi di distribuire la tua applicazione alle versioni iOS 8 e precedenti, dovrai impostare il tuo ID bundle iOS come schema personalizzato per gli URL in entrata.
    4. Per ulteriori informazioni su questo, fare riferimento alla ricezione di istruzioni iOS dinamica Links .

Dopo aver ricevuto il collegamento come descritto sopra, verificare che sia destinato all'autenticazione del collegamento e-mail e completare l'accesso.

Swift

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { user, error in
          // ...
        }
}

Obiettivo-C

if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

Per ulteriori informazioni su come gestire di accesso con il collegamento di posta elettronica in un'applicazione Android, consultare la guida di Android .

Per ulteriori informazioni su come gestire di accesso con il collegamento di posta elettronica in un'applicazione web, consultare la guida Web .

Puoi anche collegare questo metodo di autenticazione a un utente esistente. Ad esempio, un utente precedentemente autenticato con un altro provider, come un numero di telefono, può aggiungere questo metodo di accesso al proprio account esistente.

La differenza sarebbe 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.
  }

Obiettivo-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 nuovamente un utente del collegamento e-mail 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.
  }

Obiettivo-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 finire su un dispositivo diverso in cui l'utente originale non era connesso, questo flusso potrebbe non essere completato. In tal caso, può essere mostrato un errore all'utente per costringerlo ad aprire il collegamento sullo stesso dispositivo. Alcuni stati possono essere passati nel collegamento per fornire informazioni sul tipo di operazione e sull'uid dell'utente.

Nel caso in cui supportano sia la password e il link a base di accesso con la posta elettronica, per differenziare il metodo di accesso per un utente la password / link, utilizzare fetchSignInMethodsForEmail . Ciò è utile per i flussi di primo identificatore in cui all'utente viene prima chiesto di fornire la propria e-mail e quindi presentato con il metodo di accesso:

Swift

 // After asking the user for their email.
 Auth.auth().fetchSignInMethods(forEmail: email) { signInMethods, error in
   // This returns the same array as fetchProviders(forEmail:completion:) but for email
   // provider identified by 'password' string, signInMethods would contain 2
   // different strings:
   // 'emailLink' if the user previously signed in with an email/link
   // 'password' if the user has a password.
   // A user could have both.
   if (error) {
     // Handle error case.
   }
   if (!signInMethods.contains(EmailPasswordAuthSignInMethod)) {
     // User can sign in with email/password.
   }
   if (!signInMethods.contains(EmailLinkAuthSignInMethod)) {
     // User can sign in with email/link.
   }
 }

Obiettivo-C

 // After asking the user for their email.
 [FIRAuth auth] fetchSignInMethodsForEmail:email
                                completion:^(NSArray *_Nullable signInMethods,
                                             NSError *_Nullable error) {
   // This returns the same array as fetchProvidersForEmail but for email
   // provider identified by 'password' string, signInMethods would contain 2
   // different strings:
   // 'emailLink' if the user previously signed in with an email/link
   // 'password' if the user has a password.
   // A user could have both.
   if (error) {
     // Handle error case.
   }
   if (![signInMethods containsObject:FIREmailPasswordAuthSignInMethod]) {
     // User can sign in with email/password.
   }
   if (![signInMethods containsObject:FIREmailLinkAuthSignInMethod]) {
     // User can sign in with email/link.
   }
 }];

Come descritto in precedenza e-mail / password ed e-mail / link sono considerati la stessa FIREmailAuthProvider (stessa PROVIDER_ID ) con diversi metodi di accesso.

Prossimi passi

Dopo che un utente accede per la prima volta, viene creato un nuovo account utente e collegato alle credenziali, ovvero nome utente e password, numero di telefono o informazioni sul provider di autenticazione, con cui l'utente ha effettuato l'accesso. Questo nuovo account viene archiviato come parte del tuo progetto Firebase e può essere utilizzato per identificare un utente in ogni app del tuo progetto, indipendentemente da come l'utente accede.

  • Nelle vostre applicazioni, è possibile ottenere informazioni sul profilo di base dell'utente dal FIRUser oggetto. Vedere Gestione utenti .

  • Nel database Firebase in tempo reale e cloud storage Regole di sicurezza , è possibile ottenere la firma-in ID utente univoco dell'utente dal auth variabile e utilizzarlo per controllare quali dati un accesso utente può.

È possibile consentire agli utenti di accedere alla vostra applicazione utilizzando più provider di autenticazione da collegando Auth credenziali di provider per un account utente esistente.

Per firmare un utente, chiamare signOut: .

Swift

    let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}
  

Obiettivo-C

    NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

Potresti anche voler aggiungere un codice di gestione degli errori per l'intera gamma di errori di autenticazione. Vedere Errori maniglia .