Authentifizieren Sie sich bei Firebase mithilfe von E-Mail-Links

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

  1. Wenn Sie es noch nicht getan haben, befolgen Sie die Schritte im Leitfaden „Erste Schritte“ .

  2. Aktivieren Sie die E-Mail-Link-Anmeldung für Ihr Firebase-Projekt.

    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, stellen Sie eine Schnittstelle bereit, die den Benutzer auffordert, seine E-Mail-Adresse anzugeben, und rufen Sie dann sendSignInLinkToEmail() 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). Der Link leitet den Benutzer zu dieser URL weiter, wenn die App nicht auf seinem Gerät installiert ist und die App nicht installiert werden konnte.

    • androidPackageName und IOSBundleId : Die Apps, die verwendet werden sollen, wenn der Anmeldelink auf einem Android- oder iOS-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 setzen. 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.

    var acs = ActionCodeSettings(
        // URL you want to redirect back to. The domain (www.example.com) for this
        // URL must be whitelisted in the Firebase Console.
        url: 'https://www.example.com/finishSignUp?cartId=1234',
        // This must be true
        handleCodeInApp: true,
        iOSBundleId: 'com.example.ios',
        androidPackageName: 'com.example.android',
        // installIfNotAvailable
        androidInstallApp: true,
        // minimumVersion
        androidMinimumVersion: '12');
    
  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.

    var emailAuth = 'someemail@domain.com';
    FirebaseAuth.instance.sendSignInLinkToEmail(
            email: emailAuth, actionCodeSettings: acs)
        .catchError((onError) => print('Error sending email verification $onError'))
        .then((value) => print('Successfully sent email verification'));
    });
    

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 lokal speichern – beispielsweise mithilfe von SharedPreferences –, wenn Sie die Anmelde-E-Mail senden. Verwenden Sie dann diese Adresse, um den Ablauf abzuschließen. Übergeben Sie die E-Mail-Adresse des Benutzers nicht in den Umleitungs-URL-Parametern und verwenden Sie sie nicht erneut, da dies Sitzungsinjektionen ermöglichen könnte.

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 der nicht bestätigten E-Mail-Adresse und dem nicht bestätigten Passwort anmeldet.

Stellen Sie außerdem sicher, dass Sie in der Produktion eine HTTPS-URL verwenden, um zu verhindern, dass Ihr Link möglicherweise von Zwischenservern abgefangen wird.

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.

  1. Richten Sie Ihre App so ein, dass sie dynamische Links auf Flutter im Leitfaden empfängt.

  2. Überprüfen Sie in Ihrem Link-Handler, ob der Link für die E-Mail-Link-Authentifizierung gedacht ist, und schließen Sie gegebenenfalls den Anmeldevorgang ab.

    // Confirm the link is a sign-in with email link.
    if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) {
      try {
        // The client SDK will parse the code from the link for you.
        final userCredential = await FirebaseAuth.instance
            .signInWithEmailLink(email: emailAuth, emailLink: emailLink);
    
        // You can access the new user via userCredential.user.
        final emailAddress = userCredential.user?.email;
    
        print('Successfully signed in with email link!');
      } catch (error) {
        print('Error signing in with email link.');
      }
    }
    

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:

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.linkWithCredential(authCredential);
} catch (error) {
    print("Error linking emailLink credential.");
}

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

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.reauthenticateWithCredential(authCredential);
} catch (error) {
    print("Error reauthenticating credential.");
}

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 Ihr Projekt am oder nach dem 15. September 2023 erstellt haben, ist der E-Mail-Aufzählungsschutz standardmäßig aktiviert. Diese Funktion verbessert die Sicherheit der Benutzerkonten Ihres Projekts, deaktiviert jedoch die Methode fetchSignInMethodsForEmail() , die wir früher zur Implementierung von Identifier-First-Flows empfohlen haben.

Obwohl Sie den E-Mail-Aufzählungsschutz für Ihr Projekt deaktivieren können, raten wir davon ab.

Weitere Einzelheiten finden Sie in der Dokumentation zum E-Mail-Aufzählungsschutz .

Nächste Schritte

Nachdem ein Benutzer ein neues Konto erstellt hat, wird dieses Konto als Teil Ihres Firebase-Projekts gespeichert und kann zur Identifizierung eines Benutzers in jeder App in Ihrem Projekt verwendet werden, unabhängig davon, welche Anmeldemethode der Benutzer verwendet hat.

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 erlauben, sich mit mehreren Authentifizierungsanbietern bei Ihrer App anzumelden, indem Sie die Anmeldeinformationen des Authentifizierungsanbieters mit einem vorhandenen Benutzerkonto verknüpfen .

Um einen Benutzer abzumelden, rufen Sie signOut() auf:

await FirebaseAuth.instance.signOut();