Über E-Mail-Links bei 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 die 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

  1. Folgen Sie gegebenenfalls der Anleitung im Leitfaden für den Einstieg.

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

    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. Die Anmeldung per E-Mail/Passwort muss aktiviert sein, damit die Anmeldung per 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 sendSignInLinkToEmail() aufgerufen, um Firebase aufzufordern, den Authentifizierungslink an die E-Mail-Adresse des Nutzers zu senden.

  1. Erstelle das ActionCodeSettings-Objekt, das Firebase eine Anleitung zum Erstellen des E-Mail-Links liefert. 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 der Verknüpfung muss in der Liste der autorisierten Domains in der Firebase Console enthalten sein. Diese finden Sie auf dem Tab „Einstellungen“ (Authentifizierung -> Einstellungen -> Autorisierte Domains). Über den Link wird der Nutzer zu dieser URL weitergeleitet, wenn die App nicht auf seinem Gerät installiert ist und die Installation fehlgeschlagen ist.

    • androidPackageName und IOSBundleId: Die Apps, die verwendet werden sollen, wenn der Anmeldelink auf einem Android- oder iOS-Gerät geöffnet wird. Weitere Informationen zum Konfigurieren von Firebase Dynamic Links, damit E-Mail-Aktionslinks über mobile Apps geöffnet werden

    • handleCodeInApp: Legen Sie 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: (Eingestellt, verwenden Sie linkDomain) 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 geöffnet werden soll (z. B. example.page.link). Andernfalls wird automatisch die erste Domain ausgewählt.

    • linkDomain: Die optionale benutzerdefinierte Firebase Hosting-Domain, die verwendet werden soll, wenn der Link mit einer bestimmten mobilen App geöffnet werden soll. Die Domain muss in Firebase Hosting konfiguriert sein und zum Projekt gehören. Dies darf keine Standard-Hostingdomain (web.app oder firebaseapp.com) sein. Diese Einstellung ersetzt die eingestellte dynamicLinkDomain.

    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. 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 per E-Mail anmeldet.

    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

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 beim Ausführen des Anmeldevorgangs angegeben werden. 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 beim Senden der Anmelde-E-Mail ihre E-Mail-Adresse lokal, z. B. mit SharedPreferences. Verwenden Sie diese Adresse dann, um den Vorgang abzuschließen. Übergeben Sie die E-Mail-Adresse des Nutzers nicht in den Parametern der Weiterleitungs-URL und verwenden Sie sie nicht wieder, da dies Sitzungseinschleusungen ermöglichen kann.

Nach Abschluss der Anmeldung werden alle vorherigen 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 der nicht bestätigten E-Mail-Adresse und dem nicht bestätigten Passwort anmeldet.

Verwenden Sie außerdem in der Produktion eine HTTPS-URL, damit Ihr Link nicht von Zwischenservern abgefangen werden kann.

Anmeldung abschließen

Firebase Dynamic Links wird eingestellt. Firebase Hosting wird jetzt zum Senden eines Anmeldelinks verwendet. Folgen Sie der Anleitung für die plattformspezifische Konfiguration:

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.

  1. Prüfe in deinem Link-Handler, ob der Link für die E-Mail-Link-Authentifizierung gedacht ist. Wenn ja, schließe die Anmeldung 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 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:

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

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

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

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 ein Nutzer ein neues Konto erstellt hat, wird dieses Konto als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Nutzer in allen Apps in Ihrem Projekt zu identifizieren, unabhängig davon, welche Anmeldemethode der Nutzer verwendet hat.

In Ihren Apps können Sie die grundlegenden Profilinformationen des Nutzers aus dem 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.

So melden Sie einen Nutzer ab:signOut()

await FirebaseAuth.instance.signOut();