Über E-Mail-Links bei Firebase authentifizieren

Mit Firebase Authentication können Sie einen Nutzer anmelden, 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.
  • Geringeres Risiko der Wiederverwendung von Passwörtern in verschiedenen Anwendungen, was die Sicherheit selbst gut ausgewählter Passwörter untergraben kann.
  • Die Möglichkeit, einen Nutzer zu authentifizieren und gleichzeitig zu bestätigen, dass er der rechtmäßige Inhaber einer E-Mail-Adresse ist.
  • Ein Nutzer benötigt nur ein zugängliches E-Mail-Konto, um sich anzumelden. Sie müssen keine Telefonnummer oder kein Konto in sozialen Medien besitzen.
  • Nutzer können sich sicher anmelden, ohne ein Passwort eingeben 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-Kennung (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, trotzdem anmelden, ohne es zurücksetzen zu müssen.

Hinweis

  1. Falls noch nicht geschehen, folgen Sie der Anleitung unter Erste Schritte.

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

    Wenn Sie Nutzer über einen E-Mail-Link anmelden möchten, 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 mit E-Mail-Adresse und Passwort muss aktiviert sein, damit die Anmeldung mit E-Mail-Link verwendet werden kann.
    3. Aktivieren Sie im selben Bereich 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() aufzurufen, um Firebase aufzufordern, 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 gibt. Legen Sie die Werte für die folgenden Felder fest:

    • url: Der einzubettende Deeplink und alle zusätzlichen Statusinformationen, die übergeben werden sollen. Die Domain des Links muss in der Firebase Console in der Liste der autorisierten Domains enthalten sein. Diese finden Sie auf dem Tab „Einstellungen“ („Authentifizierung“ -> „Einstellungen“ -> „Autorisierte Domains“). Der Link leitet den Nutzer zu dieser URL weiter, wenn die App nicht auf seinem Gerät installiert ist und 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. Weitere Informationen zum Konfigurieren von Firebase Dynamic Links zum Öffnen von E‑Mail-Aktionslinks über mobile Apps

    • handleCodeInApp: Legen Sie true fest. Der Anmeldevorgang muss immer in der App abgeschlossen werden, im Gegensatz zu anderen Out-of-Band-E-Mail-Aktionen (Passwortzurücksetzung und E-Mail-Bestätigungen). Das liegt daran, dass der Nutzer am Ende des Ablaufs angemeldet sein und sein Authentifizierungsstatus in der App gespeichert werden soll.

    • dynamicLinkDomain: (Veraltet, 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 mit einer bestimmten mobilen App (z. B. example.page.link) geöffnet werden soll. 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 dem Projekt gehören. Dies darf keine Standard-Hostingdomain (web.app oder firebaseapp.com) sein. Diese Einstellung ersetzt die Einstellung dynamicLinkDomain, die nicht mehr unterstützt wird.

    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. Senden Sie den Authentifizierungslink an die E-Mail-Adresse des Nutzers und speichern Sie die E-Mail-Adresse des Nutzers, falls der Nutzer 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

Damit ein Anmeldelink nicht verwendet werden kann, um sich als ein nicht vorgesehener Nutzer oder auf einem nicht vorgesehenen 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 ihn angefordert haben. Speichern Sie dazu ihre E-Mail-Adresse lokal, z. B. mit SharedPreferences, wenn Sie die Anmelde-E-Mail senden. Verwenden Sie diese Adresse dann, um den Ablauf abzuschließen. Geben Sie die E-Mail-Adresse des Nutzers nicht in den Weiterleitungs-URL-Parametern an und verwenden Sie sie nicht wieder, da dies das Einschleusen von Sitzungen ermöglichen kann.

Nach Abschluss der Anmeldung werden alle zuvor nicht bestätigten Anmeldemechanismen des Nutzers 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 Nutzers entfernt, um zu verhindern, dass sich der Betrüger, der das Eigentum beansprucht und das nicht bestätigte Konto erstellt hat, noch einmal mit der nicht bestätigten E-Mail-Adresse und dem Passwort anmeldet.

Achten Sie außerdem darauf, in der Produktion eine HTTPS-URL zu verwenden, damit Ihr Link nicht von zwischengeschalteten Servern abgefangen werden kann.

Anmeldung abschließen

Firebase Dynamic Links wird eingestellt. Zum Senden eines Anmeldelinks wird jetzt Firebase Hosting verwendet. Folgen Sie den Leitfäden 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 parst und dann die Anmeldung abschließt.

  1. Prüfen Sie in Ihrem Link-Handler, ob der Link für die E-Mail-Link-Authentifizierung vorgesehen ist. Wenn ja, schließen Sie 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 Nutzer verknüpfen. Wenn sich ein Nutzer beispielsweise zuvor bei einem anderen Anbieter, z. B. mit einer Telefonnummer, authentifiziert hat, kann er diese Anmeldemethode zu seinem bestehenden Konto hinzufügen.

Der Unterschied liegt 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.");
}

Dies kann auch verwendet werden, um einen Nutzer mit E-Mail-Link neu 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 Ablauf jedoch auf einem anderen Gerät enden könnte, 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 zu zwingen, den Link auf demselben Gerät zu öffnen. Einige Status können im Link übergeben werden, um Informationen zum Vorgangstyp und zur Nutzer-UID bereitzustellen.

Wenn Sie Ihr Projekt am oder nach dem 15. September 2023 erstellt haben, ist der Schutz vor der Aufzählung von E‑Mail-Adressen standardmäßig aktiviert. Diese Funktion verbessert die Sicherheit der Nutzerkonten Ihres Projekts, deaktiviert aber die fetchSignInMethodsForEmail()-Methode, die wir früher für die Implementierung von Abläufen empfohlen haben, bei denen zuerst die Kennung eingegeben wird.

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

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

Nächste Schritte

Wenn ein Nutzer ein neues Konto erstellt, wird dieses Konto in Ihrem Firebase-Projekt gespeichert. Es 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 mit mehreren Authentifizierungsanbietern in Ihrer App anzumelden, indem Sie Anmeldedaten des Authentifizierungsanbieters mit einem vorhandenen Nutzerkonto verknüpfen.

Rufen Sie signOut() auf, um einen Nutzer abzumelden:

await FirebaseAuth.instance.signOut();