Mit E-Mail-Links in 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 gewählter Passwörter untergraben kann
  • Möglichkeit, einen Nutzer zu authentifizieren und gleichzeitig zu bestätigen, dass er der rechtmäßige Inhaber einer E-Mail-Adresse ist
  • Für die Anmeldung benötigt ein Nutzer nur ein zugängliches E-Mail-Konto. Er muss keine Telefonnummer oder kein Social-Media-Konto besitzen.
  • 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-Kennung (Passwort oder Föderation) angemeldet hat, kann so aktualisiert werden, dass er sich nur mit der E-Mail-Adresse anmelden kann. Wenn ein Nutzer beispielsweise sein Passwort vergessen hat, kann er sich trotzdem anmelden, ohne es zurücksetzen zu müssen.

Hinweis

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

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

    Wenn Sie Nutzer per E-Mail-Link anmelden möchten, müssen Sie zuerst den E-Mail-Anbieter und die Anmeldemethode per E-Mail-Link für Ihr Firebase-Projekt aktivieren:

    1. Rufen Sie in der Firebase Console Security > Authentication auf.

    2. Aktivieren Sie auf dem Tab Anmeldemethode den Anmeldeanbieter E-Mail/Passwort. Die Anmeldung per E-Mail/Passwort muss aktiviert sein, um die Anmeldung per E-Mail-Link verwenden zu können.

    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. Rufen Sie dann sendSignInLinkToEmail() auf, 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 gibt. Legen Sie die Werte für die folgenden Felder fest:

    • url: Der einzubettende Deeplink und alle zusätzlichen Statusinformationen, die weitergegeben werden sollen. Falls noch nicht geschehen, fügen Sie die Domain des Links der Liste der autorisierten Domains hinzu:

      1. Rufen Sie in der Firebase Console den Authentication > Settings tab auf.

      2. Klicken Sie im Bereich Autorisierte Domains auf Domain hinzufügen und fügen Sie die Domain des Links hinzu.

      Der Link leitet den Nutzer an diese 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. Die Anmeldung muss immer in der App abgeschlossen werden, anders als bei anderen E-Mail-Aktionen außerhalb des Ablaufs (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 sein muss.

    • 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 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 dem Projekt gehören. Dies darf keine Standard-Hosting-Domain (web.app oder firebaseapp.com) sein. Sie ersetzt die veraltete Einstellung 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. Fragen Sie 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 er 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 anderer Nutzer oder auf einem anderen Gerät anzumelden, muss die E-Mail-Adresse des Nutzers bei Abschluss des Anmeldevorgangs in Firebase Auth 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 ihn angefordert haben, indem Sie ihre E-Mail-Adresse lokal speichern, z. B. mit SharedPreferences, wenn Sie die Anmelde-E-Mail senden. Verwenden Sie dann diese Adresse, um den Ablauf abzuschließen. Geben Sie die E-Mail-Adresse des Nutzers nicht in den Parametern der Weiterleitungs-URL weiter 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 bestehenden 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, damit sich der Betrüger, der das Eigentum beansprucht und dieses nicht bestätigte Konto erstellt hat, nicht noch einmal mit der nicht bestätigten E-Mail-Adresse und dem nicht bestätigten Passwort anmelden kann.

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

Anmeldung abschließen

Firebase Dynamic Links ist veraltet. Firebase Hosting wird jetzt verwendet, um einen Anmeldelink zu senden. Folgen Sie der Anleitung für die plattformspezifische Konfiguration:

Für den Abschluss der Anmeldung über die mobile App 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 Authentifizierung per E-Mail-Link vorgesehen 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 bestehenden Nutzer verknüpfen. Ein Nutzer, der sich zuvor mit einem anderen Anbieter, z. B. einer Telefonnummer, authentifiziert hat, kann diese Anmeldemethode beispielsweise 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 dieser Ablauf 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. Im Link können einige Statusinformationen weitergegeben werden, um Informationen zum Typ des Vorgangs und zur Nutzer-UID zu liefern.

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

Sie können den Schutz vor E-Mail-Enumeration für Ihr Projekt deaktivieren, wir empfehlen dies jedoch nicht.

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 Ihres Projekts 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 den Sicherheitsregeln für die Firebase Realtime Database und Cloud Storage 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 Authentifizierungs anbietern in Ihrer App anzumelden, indem Sie Anmeldedaten des Authentifizierungsanbieters) mit einem bestehenden Nutzerkonto verknüpfen.

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

await FirebaseAuth.instance.signOut();