Authentifizieren Sie sich bei Firebase über einen E-Mail-Link auf Apple-Plattformen

Sie können die Firebase-Authentifizierung verwenden, um einen Benutzer anzumelden, indem Sie ihm eine E-Mail mit einem Link senden, auf den er klicken kann, um sich anzumelden. Dabei wird auch die E-Mail-Adresse des Benutzers überprüft.

Die Anmeldung per E-Mail bietet zahlreiche Vorteile:

  • Reibungslose Anmeldung und Anmeldung.
  • Geringeres Risiko der anwendungsübergreifenden Wiederverwendung von Passwörtern, was die Sicherheit selbst gut ausgewählter Passwörter beeinträchtigen kann.
  • Die Möglichkeit, einen Benutzer zu authentifizieren und gleichzeitig zu überprüfen, ob der Benutzer der rechtmäßige Besitzer einer E-Mail-Adresse ist.
  • Ein Benutzer benötigt lediglich ein zugängliches E-Mail-Konto, um sich anzumelden. Es ist kein Besitz einer Telefonnummer oder eines Social-Media-Kontos erforderlich.
  • Ein Benutzer kann sich sicher anmelden, ohne ein Passwort angeben (oder sich merken) zu müssen, was auf einem mobilen Gerät umständlich sein kann.
  • Ein bestehender Benutzer, der sich zuvor mit einer E-Mail-ID (Passwort oder Verbund) angemeldet hat, kann so aktualisiert werden, dass er sich nur mit der E-Mail anmeldet. Beispielsweise kann sich ein Benutzer, der sein Passwort vergessen hat, trotzdem anmelden, ohne sein Passwort zurücksetzen zu müssen.

Bevor Sie beginnen

Verwenden Sie Swift Package Manager, um Firebase-Abhängigkeiten zu installieren und zu verwalten.

  1. Navigieren Sie in Xcode bei geöffnetem App-Projekt zu File > Add Packages .
  2. Wenn Sie dazu aufgefordert werden, fügen Sie das Firebase Apple Platforms SDK-Repository hinzu:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Wählen Sie die Firebase Authentication-Bibliothek.
  5. Wenn Sie fertig sind, beginnt Xcode automatisch mit der Auflösung und dem Herunterladen Ihrer Abhängigkeiten im Hintergrund.

Um Benutzer per E-Mail-Link anzumelden, müssen Sie zunächst die Anmeldemethode E-Mail-Anbieter und E-Mail-Link für Ihr Firebase-Projekt aktivieren:

  1. Öffnen Sie in der Firebase-Konsole den Abschnitt „Auth“ .
  2. Aktivieren Sie auf der Registerkarte Anmeldemethode den E-Mail-/Passwort- Anbieter. Beachten Sie, dass die E-Mail-/Passwort-Anmeldung aktiviert sein muss, um die E-Mail-Link-Anmeldung zu verwenden.
  3. Aktivieren Sie im selben Abschnitt die Anmeldemethode E-Mail-Link (passwortlose Anmeldung) .
  4. Klicken Sie auf Speichern .

Um den Authentifizierungsfluss zu initiieren, präsentieren Sie dem Benutzer eine Schnittstelle, die ihn zur Angabe seiner E-Mail-Adresse auffordert, und rufen Sie dann sendSignInLink auf, um Firebase aufzufordern, den Authentifizierungslink an die E-Mail-Adresse des Benutzers zu senden.

  1. Erstellen Sie das ActionCodeSettings Objekt, das Firebase Anweisungen zum Erstellen des E-Mail-Links liefert. Legen Sie die folgenden Felder fest:

    • URL: Der einzubettende Deep-Link und alle weiteren weiterzugebenden Status. Die Domäne des Links muss in der Liste der autorisierten Domänen der Firebase Console auf der Whitelist stehen. Diese finden Sie auf der Registerkarte „Anmeldemethode“ (Authentifizierung -> Anmeldemethode).
    • iOSBundleID und androidPackageName: Die Apps, die verwendet werden sollen, wenn der Anmeldelink auf einem Android- oder Apple-Gerät geöffnet wird. Erfahren Sie mehr darüber, wie Sie Firebase Dynamic Links konfigurieren , um E-Mail-Aktionslinks über mobile Apps zu öffnen.
    • handleCodeInApp: Auf true gesetzt. Im Gegensatz zu anderen Out-of-Band-E-Mail-Aktionen (Zurücksetzen des Passworts und E-Mail-Verifizierungen) muss der Anmeldevorgang immer in der App abgeschlossen werden. Dies liegt daran, dass am Ende des Ablaufs davon ausgegangen wird, dass der Benutzer angemeldet ist und sein Authentifizierungsstatus in der App bestehen bleibt.
    • DynamicLinkDomain: Wenn mehrere benutzerdefinierte dynamische Linkdomänen für ein Projekt definiert sind, geben Sie an, welche verwendet werden soll, wenn der Link über eine bestimmte mobile App geöffnet werden soll (z. B. example.page.link ). Andernfalls wird automatisch die erste Domäne ausgewählt.

    Schnell

    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")
    

    Ziel 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"];
    

    Weitere Informationen zu ActionCodeSettings finden Sie im Abschnitt „Passing State in Email Actions“ .

  2. Bitten Sie den Benutzer um seine E-Mail-Adresse.

  3. Senden Sie den Authentifizierungslink an die E-Mail-Adresse des Benutzers und speichern Sie die E-Mail-Adresse des Benutzers für den Fall, dass der Benutzer die E-Mail-Anmeldung auf demselben Gerät abschließt.

    Schnell

    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")
        // ...
    }
    

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

Sicherheitsbedenken

Um zu verhindern, dass ein Anmeldelink für die Anmeldung als unbeabsichtigter Benutzer oder auf einem unbeabsichtigten Gerät verwendet wird, erfordert Firebase Auth die Angabe der E-Mail-Adresse des Benutzers beim Abschluss des Anmeldevorgangs. Damit die Anmeldung erfolgreich ist, muss diese E-Mail-Adresse mit der Adresse übereinstimmen, an die der Anmeldelink ursprünglich gesendet wurde.

Sie können diesen Ablauf für Benutzer optimieren, die den Anmeldelink auf demselben Gerät öffnen, auf dem sie den Link anfordern, indem Sie ihre E-Mail-Adresse beim Senden der Anmelde-E-Mail lokal speichern. Verwenden Sie dann diese Adresse, um den Ablauf abzuschließen.

Nach Abschluss der Anmeldung werden alle vorherigen, nicht verifizierten Anmeldemechanismen vom Benutzer entfernt und alle vorhandenen Sitzungen werden ungültig. Wenn beispielsweise jemand zuvor ein nicht bestätigtes Konto mit derselben E-Mail-Adresse und demselben Passwort erstellt hat, wird das Passwort des Benutzers entfernt, um zu verhindern, dass sich der Nachahmer, der den Besitz beansprucht und das nicht bestätigte Konto erstellt hat, erneut mit demselben Konto anmeldet.

Abschließen der Anmeldung in einer mobilen Apple-App

Die Firebase-Authentifizierung verwendet Firebase Dynamic Links, um den E-Mail-Link an ein mobiles Gerät zu senden. Für den Abschluss der Anmeldung über eine mobile Anwendung muss die Anwendung so konfiguriert werden, dass sie den eingehenden Anwendungslink erkennt, den zugrunde liegenden Deep-Link analysiert und dann die Anmeldung abschließt.

Firebase Auth verwendet Firebase Dynamic Links beim Senden eines Links, der in einer mobilen Anwendung geöffnet werden soll. Um diese Funktion nutzen zu können, müssen dynamische Links in der Firebase-Konsole konfiguriert werden.

  1. Aktivieren Sie dynamische Firebase-Links:

    1. Öffnen Sie in der Firebase-Konsole den Abschnitt „Dynamische Links“ .
    2. Wenn Sie die Dynamic Links-Bedingungen noch nicht akzeptiert und keine Dynamic Links-Domäne erstellt haben, tun Sie dies jetzt.

      Wenn Sie bereits eine Dynamic Links-Domäne erstellt haben, notieren Sie sich dies. Eine Dynamic Links-Domäne sieht normalerweise wie im folgenden Beispiel aus:

      example.page.link

      Sie benötigen diesen Wert, wenn Sie Ihre Apple- oder Android-App so konfigurieren, dass sie den eingehenden Link abfängt.

  2. Konfigurieren von Apple-Anwendungen:

    1. Wenn Sie diese Links von Ihrer Anwendung aus verarbeiten möchten, muss die Bundle-ID in den Projekteinstellungen der Firebase Console angegeben werden. Darüber hinaus müssen auch die App Store ID und die Apple Developer Team ID angegeben werden.
    2. Sie müssen außerdem Ihre E-Mail-Aktionshandlerdomäne in Ihren Anwendungsfunktionen als zugeordnete Domäne konfigurieren. Standardmäßig wird der E-Mail-Aktionshandler auf einer Domäne wie im folgenden Beispiel gehostet:
      APP_ID.firebaseapp.com
    3. Wenn Sie planen, Ihre Anwendung an iOS-Versionen 8 und niedriger zu verteilen, müssen Sie Ihre Bundle-ID als benutzerdefiniertes Schema für eingehende URLs festlegen.
    4. Weitere Informationen hierzu finden Sie in den Anweisungen zum Empfangen dynamischer Links für die Apple-Plattform .

Nachdem Sie den Link wie oben beschrieben erhalten haben, überprüfen Sie, ob er für die E-Mail-Link-Authentifizierung gedacht ist, und schließen Sie die Anmeldung ab.

Schnell

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

Ziel c

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

Informationen zum Umgang mit der Anmeldung per E-Mail-Link in einer Android-Anwendung finden Sie im Android-Handbuch .

Weitere Informationen zum Umgang mit der Anmeldung per E-Mail-Link in einer Webanwendung finden Sie im Web-Handbuch .

Sie können diese Authentifizierungsmethode auch mit einem vorhandenen Benutzer verknüpfen. Beispielsweise kann ein Benutzer, der sich zuvor bei einem anderen Anbieter, beispielsweise einer Telefonnummer, authentifiziert hat, diese Anmeldemethode zu seinem bestehenden Konto hinzufügen.

Der Unterschied wäre in der zweiten Hälfte der Operation:

Schnell

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

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

Dies kann auch verwendet werden, um einen E-Mail-Link-Benutzer erneut zu authentifizieren, bevor ein vertraulicher Vorgang ausgeführt wird.

Schnell

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

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

Da der Flow jedoch auf einem anderen Gerät landen könnte, auf dem der ursprüngliche Benutzer nicht angemeldet war, wird dieser Flow möglicherweise nicht abgeschlossen. In diesem Fall kann dem Benutzer ein Fehler angezeigt werden, der ihn dazu zwingt, den Link auf demselben Gerät zu öffnen. Im Link kann ein Status übergeben werden, um Informationen über die Art des Vorgangs und die Benutzer-UID bereitzustellen.

Wenn Sie sowohl die passwort- als auch die linkbasierte Anmeldung per E-Mail unterstützen, verwenden Sie fetchSignInMethodsForEmail , um die Anmeldemethode für einen Passwort-/Link-Benutzer zu unterscheiden. Dies ist nützlich für Identifier-First-Flows, bei denen der Benutzer zunächst aufgefordert wird, seine E-Mail-Adresse anzugeben, und ihm dann die Anmeldemethode angezeigt wird:

Schnell

 // 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.
   }
 }

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

Wie oben beschrieben werden E-Mail/Passwort und E-Mail/Link als derselbe EmailAuthProvider (gleiche PROVIDER_ID ) mit unterschiedlichen Anmeldemethoden betrachtet.

Nächste Schritte

Nachdem sich ein Benutzer zum ersten Mal angemeldet hat, wird ein neues Benutzerkonto erstellt und mit den Anmeldeinformationen – also dem Benutzernamen und dem Kennwort, der Telefonnummer oder den Informationen zum Authentifizierungsanbieter – verknüpft, mit denen sich der Benutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann zur Identifizierung eines Benutzers in jeder App in Ihrem Projekt verwendet werden, unabhängig davon, wie sich der Benutzer anmeldet.

  • In Ihren Apps können Sie die grundlegenden Profilinformationen des Benutzers aus dem User Objekt abrufen. Siehe Benutzer verwalten .

  • In Ihren Firebase-Echtzeitdatenbank- und Cloud-Speicher- Sicherheitsregeln können Sie die eindeutige Benutzer-ID des angemeldeten Benutzers aus der auth abrufen und damit steuern, auf welche Daten ein Benutzer zugreifen kann.

Sie können Benutzern die Anmeldung bei Ihrer App mit mehreren Authentifizierungsanbietern ermöglichen, indem Sie die Anmeldeinformationen des Authentifizierungsanbieters mit einem vorhandenen Benutzerkonto verknüpfen.

Um einen Benutzer abzumelden, rufen Sie signOut: auf.

Schnell

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

Ziel c

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

Möglicherweise möchten Sie auch Fehlerbehandlungscode für alle Authentifizierungsfehler hinzufügen. Siehe Fehler behandeln .