Authentifizieren Sie sich bei Firebase mithilfe eines E-Mail-Links auf Apple-Plattformen

Sie können Firebase Authentication verwenden, um einen Benutzer anzumelden, indem Sie ihm eine E-Mail mit einem Link senden, auf den er zum Anmelden klicken kann. Dabei wird auch die E-Mail-Adresse des Benutzers verifiziert.

Die Anmeldung per E-Mail bietet zahlreiche Vorteile:

  • Reibungsarme Anmeldung und Anmeldung.
  • Geringeres Risiko der Wiederverwendung von Kennwörtern über Anwendungen hinweg, was die Sicherheit selbst gut ausgewählter Kennwörter untergraben 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 nur 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 eingeben (oder sich merken) zu müssen, was auf einem Mobilgerät umständlich sein kann.
  • Ein vorhandener Benutzer, der sich zuvor mit einer E-Mail-Kennung (Passwort oder Verbund) angemeldet hat, kann aktualisiert werden, um sich nur mit der E-Mail anzumelden. So kann sich beispielsweise ein Benutzer, der sein Kennwort vergessen hat, trotzdem anmelden, ohne sein Kennwort zurücksetzen zu müssen.

Bevor Sie beginnen

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

  1. In Xcode, mit Ihrem App - Projekt zu öffnen, navigieren Sie zu Datei> Swift Packages> Paket hinzufügen Abhängigkeit.
  2. Wenn Sie dazu aufgefordert werden, fügen Sie das SDK-Repository der Firebase Apple Platforms hinzu:
  3.   https://github.com/firebase/firebase-ios-sdk
      
  4. Wählen Sie die Firebase Authentication-Bibliothek aus.
  5. Wenn Sie fertig sind, beginnt Xcode automatisch, Ihre Abhängigkeiten im Hintergrund aufzulösen und herunterzuladen.

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

  1. In der Firebase Konsole , öffnen Sie den Abschnitt Auth.
  2. Auf dem Anmelden Methode Registerkarte, aktivieren Sie 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. Im selben Abschnitt aktiviert E - Mail - Link ( ohne Passwort-Anmeldung) Anmelde-Verfahren.
  4. Klicken Sie auf Speichern.

Zur Initiierung der Authentifizierungsablauf stellen dem Benutzer eine Schnittstelle , die Anweisungen , um den Benutzer zu geben , ihre E - Mail - Adresse und dann rufen sendSignInLinkToEmail:actionCodeSettings:completion: zu fordern , dass die Authentifizierungsfirebase Verbindung des Benutzers E - Mail senden.

  1. Konstruieren Sie das ActionCodeSettings Objekt, das Firebase mit Anweisungen liefert , wie der E - Mail - Link zu konstruieren. Legen Sie die folgenden Felder fest:

    • url: Der Deep-Link zum Einbetten und jeder zusätzliche Status, der weitergegeben werden soll. Die Domain des Links muss in der Firebase Console-Liste der autorisierten Domains auf die Whitelist gesetzt werden, die auf der Registerkarte Anmeldemethode (Authentifizierung -> Anmeldemethode) zu finden ist.
    • 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 auf Firebase dynamische Links konfigurieren zu öffnen E - Mail - Aktion Verbindungen über mobile Anwendungen.
    • handleCodeInApp: Auf true gesetzt. Der Anmeldevorgang muss im Gegensatz zu anderen Out-of-Band-E-Mail-Aktionen (Passwortrücksetzung und E-Mail-Verifizierungen) immer in der App durchgeführt werden. Dies liegt daran, dass am Ende des Flows erwartet wird, dass der Benutzer angemeldet ist und sein Authentifizierungsstatus in der App beibehalten wird.
    • dynamicLinkDomain: Wenn mehrere benutzerdefinierte Dynamic Link - Domänen sind für ein Projekt definiert ist , anzugeben , welche eine verwenden , wenn die Verbindung über eine spezifizierte mobile app geöffnet werden soll (beispielsweise 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"];
    

    Um mehr zu erfahren über ActionCodeSettings, beziehen sich auf die Übergabe Staat in E - Mail - Aktionen Abschnitt.

  2. Fragen Sie den Benutzer nach seiner E-Mail.

  3. Senden Sie den Authentifizierungslink an die E-Mail des Benutzers und speichern Sie die E-Mail 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 verwendet wird, um sich als unbeabsichtigter Benutzer oder auf einem unbeabsichtigten Gerät anzumelden, erfordert Firebase Auth die Angabe der E-Mail-Adresse des Benutzers beim Abschließen 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 lokal speichern, wenn Sie die Anmelde-E-Mail senden. Verwenden Sie dann diese Adresse, um den Flow abzuschließen.

Nach Abschluss der Anmeldung werden alle vorherigen nicht überprüften Anmeldemechanismen vom Benutzer entfernt und alle vorhandenen Sitzungen werden ungültig gemacht. Wenn beispielsweise jemand zuvor ein unbestä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 die Inhaberschaft beansprucht und dieses unbestätigte Konto erstellt hat, erneut mit demselben Konto anmeldet.

Abschließen der Anmeldung in einer mobilen Apple-App

Firebase Authentication verwendet Firebase Dynamic Links, um den E-Mail-Link an ein Mobilgerät zu senden. Um die Anmeldung über die mobile Anwendung abzuschließen, muss die Anwendung so konfiguriert werden, dass sie den eingehenden Anwendungslink erkennt, den zugrunde liegenden Deeplink parst und dann die Anmeldung abschließt.

Firebase Auth verwendet Firebase dynamische Links , wenn Sie einen Link zu senden , die in einer mobilen Anwendung geöffnet werden soll. Um diese Funktion nutzen zu können, müssen Dynamic Links in der Firebase Console konfiguriert werden.

  1. Dynamische Firebase-Links aktivieren:

    1. In der Firebase Konsole öffnet Abschnitt des dynamischen Links.
    2. Wenn Sie die Bedingungen für Dynamic Links noch nicht akzeptiert und eine Dynamic Links-Domäne erstellt haben, tun Sie dies jetzt.

      Wenn Sie bereits eine Dynamic Links-Domäne erstellt haben, notieren Sie sich diese. 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 konfigurieren, um den eingehenden Link abzufangen.

  2. Apple-Anwendungen konfigurieren:

    1. Wenn Sie diese Links von Ihrer Anwendung aus 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 Ihre E-Mail-Action-Handler-Domain als Associated Domain in Ihren Anwendungsfunktionen konfigurieren. Standardmäßig wird der E - Mail - Action - Handler auf einer Domain wie im folgende Beispiel gehostet:
      APP_ID.firebaseapp.com
    3. Wenn Sie Ihre Anwendung an iOS-Versionen 8 und darunter verteilen möchten, müssen Sie Ihre Bundle-ID als benutzerdefiniertes Schema für eingehende URLs festlegen.
    4. Denn auf diese mehr finden Sie auf Apple - Plattform dynamische Links Anweisungen empfangen .

Nachdem Sie den Link wie oben beschrieben erhalten haben, überprüfen Sie, ob er für die E-Mail-Link-Authentifizierung bestimmt 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) {
      // ...
    }];
}

Um zu erfahren , wie zu handhaben -Anmeldung mit E - Mail - Link in einer Android - Anwendung finden Sie im Android Guide .

Um zu erfahren , wie zu handhaben -Anmeldung mit E - Mail - Link in einer Web - Anwendung finden Sie im Web Guide .

Sie können diese Authentifizierungsmethode auch mit einem vorhandenen Benutzer verknüpfen. Beispielsweise kann ein Benutzer, der sich zuvor bei einem anderen Anbieter wie 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 kann, 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, um ihn zu zwingen, 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.

Im Fall unterstützen Sie sowohl Passwort und Link-basierte-Anmeldung mit E - Mail, die Methode der Anmeldung für ein Passwort / link Benutzer zu unterscheiden, verwenden fetchSignInMethodsForEmail . Dies ist nützlich für Identifier-First-Flows, bei denen der Benutzer zuerst aufgefordert wird, seine E-Mail-Adresse anzugeben und 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 E - Mail / Passwort und E - Mail / link beschrieben ist der gleiche betrachtet FIREmailAuthProvider (gleiche PROVIDER_ID ) mit verschiedenen Methoden der Anmeldung.

Nächste Schritte

Nachdem sich ein Benutzer zum ersten Mal anmeldet, wird ein neues Benutzerkonto erstellt und mit den Anmeldeinformationen – d. h. Benutzername und Kennwort, Telefonnummer oder Authentifizierungsanbieterinformationen – verknüpft, mit denen sich der Benutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Benutzer in jeder App in Ihrem Projekt zu identifizieren, unabhängig davon, wie sich der Benutzer anmeldet.

  • In Ihren Anwendungen können Sie die Benutzerprofilgrundinformationen aus dem bekommen FIRUser Objekt. Siehe Benutzer verwalten .

  • In Ihrer Datenbank und Firebase Realtime Cloud Storage Sicherheitsregeln , können Sie die angemeldeten Nutzer die eindeutige Benutzer - ID aus der bekommen auth Variable, und es verwenden , um steuern kann ein Benutzer Zugriff , welche Daten.

Sie können Benutzer erlauben , durch mehrere Authentifizierungsanbieter anmelden, um Ihre App Verknüpfung Auth - Provider - Anmeldeinformationen zu einem vorhandenen Benutzerkonto.

Um einen Benutzer abzumelden, rufen signOut: .

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 einen Fehlerbehandlungscode für alle Authentifizierungsfehler hinzufügen. Siehe Handle Fehler .