Über einen E-Mail-Link auf Apple-Plattformen mit Firebase authentifizieren

Sie können Firebase Authentication verwenden, um einen Nutzer 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 Nutzers bestätigt.

Die Anmeldung per E-Mail bietet zahlreiche Vorteile:

  • Einfache Registrierung und Anmeldung
  • Weniger Risiko, dass Passwörter in verschiedenen Anwendungen wiederverwendet werden, was die Sicherheit selbst gut ausgewählter Passwörter untergraben kann.
  • Die Möglichkeit, einen Nutzer zu authentifizieren und gleichzeitig zu prüfen, ob er der rechtmäßige Inhaber einer E-Mail-Adresse ist.
  • Nutzer benötigen nur ein zugängliches E-Mail-Konto, um sich anzumelden. Sie müssen nicht Inhaber einer Telefonnummer oder eines Kontos in sozialen Medien sein.
  • Ein Nutzer kann sich sicher anmelden, ohne ein Passwort angeben oder sich merken zu müssen, was auf einem Mobilgerät umständlich sein kann.
  • Ein bestehender Nutzer, der sich zuvor mit einer E-Mail-ID (Passwort oder föderiert) angemeldet hat, kann auf eine Anmeldung nur mit der E-Mail-Adresse umgestellt werden. So kann sich ein Nutzer, der sein Passwort vergessen hat, beispielsweise anmelden, ohne es zurücksetzen zu müssen.

Hinweis

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

  1. Öffnen Sie Ihr App-Projekt und gehen Sie in Xcode zu File > Add Packages (Datei > Pakete hinzufügen).
  2. Fügen Sie bei entsprechender Aufforderung das Firebase Apple Platforms SDK-Repository hinzu:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Wählen Sie die Bibliothek Firebase Authentication aus.
  5. Fügen Sie das Flag -ObjC im Abschnitt Other Linker Flags (Weitere Verknüpfungsmerker) der Build-Einstellungen des Ziels hinzu.
  6. Wenn Sie fertig, beginnt Xcode automatisch, Ihre Abhängigkeiten im Hintergrund aufzulösen und herunterzuladen.

Damit Nutzer sich per E-Mail-Link anmelden können, müssen Sie zuerst den E-Mail-Anbieter und die Anmeldemethode „E-Mail-Link“ für Ihr Firebase-Projekt aktivieren:

  1. Öffnen Sie in der Firebase Console den Bereich Auth.
  2. Aktivieren Sie auf dem Tab Anmeldemethode den Anbieter E-Mail/Passwort. Hinweis: Die Anmeldung per E-Mail/Passwort muss aktiviert sein, damit die Anmeldung über einen E-Mail-Link verwendet werden kann.
  3. Aktivieren Sie im selben Abschnitt die Anmeldemethode E-Mail-Link (Anmeldung ohne Passwort).
  4. Klicken Sie auf Speichern.

Zum Initiieren des Authentifizierungsablaufs wird eine Schnittstelle angezeigt, in der der Nutzer aufgefordert wird, seine E-Mail-Adresse anzugeben, und dann sendSignInLink aufgerufen, um Firebase zu bitten, den Authentifizierungslink an die E-Mail-Adresse des Nutzers zu senden.

  1. Erstellen Sie das ActionCodeSettings-Objekt, das Firebase Anweisungen zum Erstellen des E-Mail-Links enthält. Legen Sie die Werte für die folgenden Felder fest:

    • url: Der einzubettende Deeplink und alle zusätzlichen Status, die übergeben werden sollen. Die Domain des Links muss in der Liste der autorisierten Domains in der Firebase Console auf die Zulassungsliste gesetzt werden. Sie finden diese Liste auf dem Tab „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. Weitere Informationen zum Konfigurieren von Firebase Dynamic Links, um E-Mail-Aktionslinks über mobile Apps zu öffnen
    • handleCodeInApp: Legen Sie den Wert auf „true“ fest. Im Gegensatz zu anderen E-Mail-Aktionen außerhalb des Bandes (Passwort zurücksetzen und E-Mail-Bestätigungen) muss die Anmeldung immer in der App erfolgen. Das liegt daran, dass der Nutzer am Ende des Ablaufs angemeldet sein und sein Authentifizierungsstatus in der App gespeichert sein soll.
    • dynamicLinkDomain: Wenn für ein Projekt mehrere benutzerdefinierte Dynamic Link-Domains definiert sind, geben Sie an, welche verwendet werden soll, wenn der Link über eine bestimmte mobile App (z. B. example.page.link) geöffnet werden soll. Andernfalls wird automatisch die erste Domain ausgewählt.

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

    Weitere Informationen zu ActionCodeSettings finden Sie im Abschnitt Status in E-Mail-Aktionen übergeben.

  2. Frage den Nutzer nach seiner E-Mail-Adresse.

  3. Sende den Authentifizierungslink an die E-Mail-Adresse des Nutzers und speichere die E-Mail-Adresse des Nutzers für den Fall, dass er sich auf demselben Gerät mit der E-Mail-Adresse anmeldet.

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

Sicherheitsbedenken

Damit ein Anmeldelink nicht dazu verwendet werden kann, sich als nicht beabsichtigter Nutzer oder auf einem nicht beabsichtigten Gerät anzumelden, muss bei Firebase Auth die E-Mail-Adresse des Nutzers angegeben werden, wenn der Anmeldevorgang abgeschlossen wird. 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 Nutzer optimieren, die den Anmeldelink auf demselben Gerät öffnen, auf dem sie den Link anfordern. Speichern Sie dazu die E-Mail-Adresse lokal, wenn Sie die Anmelde-E-Mail senden. Verwenden Sie dann diese Adresse, um den Vorgang abzuschließen.

Nach Abschluss der Anmeldung werden alle zuvor nicht bestätigten Anmeldemechanismen für den Nutzer entfernt und alle vorhandenen Sitzungen ungültig gemacht. Wenn beispielsweise jemand zuvor ein nicht bestätigtes Konto mit derselben E-Mail-Adresse und demselben Passwort erstellt hat, wird das Passwort des Nutzers entfernt, um zu verhindern, dass sich der Betrüger, der den Anspruch auf das Konto erhoben und dieses nicht bestätigte Konto erstellt hat, noch einmal mit demselben Konto anmeldet.

Anmeldung in einer mobilen Apple-App abschließen

Firebase Authentication verwendet Firebase Dynamic Links, um den E-Mail-Link an ein Mobilgerät zu senden. Damit die Anmeldung über eine mobile App abgeschlossen werden kann, muss die App so konfiguriert sein, dass sie den eingehenden App-Link erkennt, den zugrunde liegenden Deeplink analysiert und dann die Anmeldung abschließt.

Firebase Auth verwendet Firebase Dynamic Links, wenn ein Link gesendet wird, der in einer mobilen Anwendung geöffnet werden soll. Damit Sie diese Funktion verwenden können, müssen Dynamic Links in der Firebase Console konfiguriert werden.

  1. Firebase Dynamic Links aktivieren:

    1. Öffnen Sie in der Firebase Console den Bereich Dynamic Links.
    2. Wenn Sie die Dynamic Links-Nutzungsbedingungen noch nicht akzeptiert und keine Dynamic Links-Domain erstellt haben, tun Sie dies jetzt.

      Wenn Sie bereits eine Dynamic Links-Domain erstellt haben, notieren Sie sich diese. Eine Dynamic Links-Domain sieht in der Regel so aus:

      example.page.link

      Sie benötigen diesen Wert, wenn Sie Ihre Apple- oder Android-App so konfigurieren, dass der eingehende Link abgefangen wird.

  2. Apple-Anwendungen konfigurieren:

    1. Wenn Sie diese Links über Ihre Anwendung verarbeiten möchten, muss die Bundle-ID in den Projekteinstellungen der Firebase Console angegeben werden. Außerdem müssen die App Store-ID und die Apple Developer-Team-ID angegeben werden.
    2. Außerdem müssen Sie die Domain Ihres E-Mail-Aktions-Handlers als verknüpfte Domain in Ihren Anwendungsfunktionen konfigurieren. Standardmäßig wird der E-Mail-Aktions-Handler auf einer Domain wie in diesem Beispiel gehostet:
      APP_ID.firebaseapp.com
    3. Wenn Sie Ihre Anwendung für iOS-Versionen 8 und niedriger bereitstellen möchten, müssen Sie Ihre Bundle-ID als benutzerdefiniertes Schema für eingehende URLs festlegen.
    4. Weitere Informationen finden Sie unter Anleitung zum Empfangen von dynamischen Links für die Apple-Plattform.

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

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

Informationen zum Umgang mit der Anmeldung über einen E-Mail-Link in einer Android-App findest du im Android-Leitfaden.

Informationen zum Umgang mit der Anmeldung über den E-Mail-Link in einer Webanwendung finden Sie im Web-Leitfaden.

Sie können diese Authentifizierungsmethode auch mit einem vorhandenen Nutzer verknüpfen. Ein Nutzer, der sich beispielsweise zuvor mit einem anderen Anbieter authentifiziert hat, z. B. mit einer Telefonnummer, kann diese Anmeldemethode seinem bestehenden Konto hinzufügen.

Der Unterschied besteht in der zweiten Hälfte des Vorgangs:

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

So können Sie auch einen Nutzer mit E-Mail-Link noch einmal authentifizieren, bevor Sie einen sensiblen Vorgang ausführen.

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

Da der Ablauf jedoch auf einem anderen Gerät enden kann, auf dem der ursprüngliche Nutzer nicht angemeldet war, wird er möglicherweise nicht abgeschlossen. In diesem Fall kann dem Nutzer ein Fehler angezeigt werden, um ihn dazu zu zwingen, den Link auf demselben Gerät zu öffnen. Über den Link kann ein bestimmter Status übergeben werden, um Informationen zur Art der Operation und zur Nutzer-UID bereitzustellen.

Wenn Sie Ihr Projekt am oder nach dem 15. September 2023 erstellt haben, ist der Schutz vor E-Mail-Aufzählungen standardmäßig aktiviert. Diese Funktion verbessert die Sicherheit der Nutzerkonten Ihres Projekts, deaktiviert aber die fetchSignInMethodsForEmail()-Methode, die wir zuvor für die Implementierung von Abläufen mit Priorität für die Kennung empfohlen haben.

Sie können den Schutz vor E-Mail-Enumeration für Ihr Projekt zwar deaktivieren, wir raten davon jedoch ab.

Weitere Informationen finden Sie in der Dokumentation zum Schutz vor E-Mail-Enumeration.

Nächste Schritte

Nachdem sich ein Nutzer zum ersten Mal angemeldet hat, wird ein neues Nutzerkonto erstellt und mit den Anmeldedaten verknüpft, d. h. mit dem Nutzernamen und Passwort, der Telefonnummer oder den Informationen zum Authentifizierungsanbieter, mit denen sich der Nutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Nutzer in allen Apps in Ihrem Projekt zu identifizieren, unabhängig davon, wie er sich anmeldet.

  • In Ihren Apps können Sie die grundlegenden Profilinformationen des Nutzers über das User-Objekt abrufen. Weitere Informationen finden Sie unter Nutzer verwalten.

  • In Ihren Firebase Realtime Database- und Cloud Storage-Sicherheitsregeln können Sie die eindeutige Nutzer-ID des angemeldeten Nutzers aus der Variablen auth abrufen und damit steuern, auf welche Daten ein Nutzer zugreifen kann.

Sie können Nutzern erlauben, sich über mehrere Authentifizierungsanbieter in Ihrer App anzumelden, indem Sie Anmeldedaten des Authentifizierungsanbieters mit einem vorhandenen Nutzerkonto verknüpfen.

Wenn Sie einen Nutzer abmelden möchten, rufen Sie signOut: auf.

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

Sie können auch Code zur Fehlerbehandlung für alle Authentifizierungsfehler hinzufügen. Weitere Informationen finden Sie unter Fehler behandeln.