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 verifiziert.

Die Anmeldung per E-Mail bietet zahlreiche Vorteile:

  • Reibungslose Anmeldung und Anmeldung.
  • Geringeres Risiko der Wiederverwendung von Passwörtern über Anwendungen hinweg, was die Sicherheit selbst gut ausgewählter Passwörter untergraben kann.
  • Die Möglichkeit, einen Benutzer zu authentifizieren und gleichzeitig zu überprüfen, ob der Benutzer der rechtmäßige Eigentümer 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 Kennwort 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-Kennung (Kennwort oder Verbund) angemeldet hat, kann aktualisiert werden, um sich nur mit der E-Mail anzumelden. Beispielsweise kann sich ein Benutzer, der sein Kennwort vergessen hat, immer noch anmelden, ohne sein Kennwort zurücksetzen zu müssen.

Bevor Sie beginnen

  1. Wenn Sie dies noch nicht getan haben, folgen Sie den Schritten im Handbuch „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 zuerst 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-/Kennwortanbieter . Beachten Sie, dass die Anmeldung per E-Mail/Passwort aktiviert sein muss, um die Anmeldung per E-Mail-Link zu verwenden.
    3. Aktivieren Sie im selben Abschnitt die Anmeldemethode E-Mail-Link (kennwortlose Anmeldung) .
    4. Klicken Sie auf Speichern .

Stellen Sie zum Initiieren des Authentifizierungsablaufs eine Schnittstelle bereit, die den Benutzer auffordert, seine E-Mail-Adresse anzugeben, und rufen Sie dann sendSignInLinkToEmail() auf, um anzufordern, dass Firebase den Authentifizierungslink an die E-Mail-Adresse des Benutzers sendet.

  1. Erstellen Sie das ActionCodeSettings-Objekt, das Firebase Anweisungen zum Erstellen des E-Mail-Links bereitstellt. Legen Sie die folgenden Felder fest:

    • url : Der einzubettende Deep-Link und jeder zusätzliche Zustand, der weitergegeben werden soll. Die Domäne des Links muss in der Liste der autorisierten Domänen der Firebase-Konsole auf die weiße Liste gesetzt werden, die auf der Registerkarte Anmeldemethode (Authentifizierung -> Anmeldemethode) zu finden ist. 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 zu verwendenden Apps, 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. Der Anmeldevorgang muss im Gegensatz zu anderen Out-of-Band-E-Mail-Aktionen (Passwortzurücksetzung und E-Mail-Bestätigungen) immer in der App abgeschlossen werden. Dies liegt daran, dass der Benutzer am Ende des Flusses voraussichtlich angemeldet ist und sein Authentifizierungsstatus in der App beibehalten wird.

    • 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. Fragen Sie den Benutzer nach seiner E-Mail-Adresse.

  3. Senden Sie den Authentifizierungslink an die E-Mail-Adresse des Benutzers und speichern Sie die E-Mail-Adresse des Benutzers, falls 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 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, 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 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 Flow abzuschließen. Übergeben Sie die E-Mail-Adresse des Benutzers nicht in den Umleitungs-URL-Parametern und verwenden Sie sie erneut, da dies Sitzungsinjektionen ermöglichen kann.

Nach Abschluss der Anmeldung werden alle vorherigen unbestätigten Anmeldemechanismen des Benutzers entfernt und alle vorhandenen Sitzungen werden ungültig. 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 Imitator, der die Inhaberschaft beansprucht und dieses unbestätigte Konto erstellt hat, erneut mit der unbestätigten E-Mail-Adresse und dem unbestätigten Passwort anmeldet.

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

Die Firebase-Authentifizierung verwendet dynamische Firebase-Links, um den E-Mail-Link an ein mobiles Gerät zu senden. Für den Anmeldeabschluss über eine mobile Anwendung muss die Anwendung so konfiguriert werden, dass sie den eingehenden Anwendungslink erkennt, den zugrunde liegenden Deep-Link parst und dann die Anmeldung abschließt.

  1. Richten Sie Ihre App ein, um dynamische Links auf Flutter in der Anleitung zu erhalten.

  2. Überprüfen Sie in Ihrem Link-Handler, ob der Link für die E-Mail-Link-Authentifizierung bestimmt ist, und schließen Sie in diesem Fall 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 zuvor bei einem anderen Anbieter authentifiziert wurde, z. B. eine Telefonnummer, 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 eine vertrauliche Operation 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, um ihn zu zwingen, den Link auf demselben Gerät zu öffnen. Im Link kann ein Status übergeben werden, um Informationen über die Art der Operation und die Benutzer-UID bereitzustellen.

Falls Sie sowohl die kennwort- als auch die linkbasierte Anmeldung mit E-Mail unterstützen, verwenden fetchSignInMethodsForEmail , um die Anmeldemethode für einen Kennwort-/Link-Benutzer zu unterscheiden. 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:

try {
    final signInMethods =
        await FirebaseAuth.instance.fetchSignInMethodsForEmail(emailAuth);
    final userExists = signInMethods.isNotEmpty;
    final canSignInWithLink = signInMethods
        .contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD);
    final canSignInWithPassword = signInMethods
        .contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD);
} on FirebaseAuthException catch (exception) {
    switch (exception.code) {
        case "invalid-email":
            print("Not a valid email address.");
            break;
        default:
            print("Unknown error.");
    }
}

Wie oben beschrieben, gelten E-Mail/Passwort und E-Mail/Link als derselbe EmailAuthProvider (dieselbe PROVIDER_ID ) mit unterschiedlichen Anmeldemethoden.

Nächste Schritte

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

In Ihren Apps können Sie die grundlegenden Profilinformationen des Benutzers aus dem User abrufen. Siehe Benutzer verwalten .

In Ihren Firebase-Echtzeitdatenbank- und Cloudspeicher-Sicherheitsregeln können Sie die eindeutige Benutzer-ID des angemeldeten Benutzers aus der auth -Variable 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 signOut() :

await FirebaseAuth.instance.signOut();