Authentifizieren Sie sich bei Firebase über den E-Mail-Link in Android

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

Richten Sie Ihr Android-Projekt ein

  1. Falls noch nicht geschehen, fügen Sie Firebase zu Ihrem Android-Projekt hinzu .

  2. Fügen Sie in Ihrer Modul-Gradle-Datei (auf App-Ebene) (normalerweise <project>/<app-module>/build.gradle.kts oder <project>/<app-module>/build.gradle ) die Abhängigkeit für die Firebase-Authentifizierung hinzu Bibliothek für Android. Wir empfehlen die Verwendung der Firebase Android BoM zur Steuerung der Bibliotheksversionierung.

    Außerdem müssen Sie im Rahmen der Einrichtung der Firebase-Authentifizierung das Google Play Services SDK zu Ihrer App hinzufügen.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.8.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.0.0")
    }

    Durch die Verwendung der Firebase Android BoM verwendet Ihre App immer kompatible Versionen der Firebase Android-Bibliotheken.

    (Alternative) Fügen Sie Firebase-Bibliotheksabhängigkeiten hinzu , ohne die Stückliste zu verwenden

    Wenn Sie die Firebase-Stückliste nicht verwenden möchten, müssen Sie jede Firebase-Bibliotheksversion in ihrer Abhängigkeitszeile angeben.

    Beachten Sie: Wenn Sie mehrere Firebase-Bibliotheken in Ihrer App verwenden, empfehlen wir dringend, die BoM zum Verwalten der Bibliotheksversionen zu verwenden, um sicherzustellen, dass alle Versionen kompatibel sind.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:22.3.1")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.0.0")
    }
    Suchen Sie nach einem Kotlin-spezifischen Bibliotheksmodul? Ab Oktober 2023 (Firebase BoM 32.5.0) können sich sowohl Kotlin- als auch Java-Entwickler auf das Hauptbibliotheksmodul verlassen (Einzelheiten finden Sie in den FAQ zu dieser Initiative ).

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, präsentieren Sie dem Benutzer eine Schnittstelle, die den Benutzer zur Angabe seiner E-Mail-Adresse auffordert, 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 Apple-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.

    Kotlin+KTX

    val actionCodeSettings = 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
        setIOSBundleId("com.example.ios")
        setAndroidPackageName(
            "com.example.android",
            true, // installIfNotAvailable
            "12", // minimumVersion
        )
    }

    Java

    ActionCodeSettings actionCodeSettings =
            ActionCodeSettings.newBuilder()
                    // URL you want to redirect back to. The domain (www.example.com) for this
                    // URL must be whitelisted in the Firebase Console.
                    .setUrl("https://www.example.com/finishSignUp?cartId=1234")
                    // This must be true
                    .setHandleCodeInApp(true)
                    .setIOSBundleId("com.example.ios")
                    .setAndroidPackageName(
                            "com.example.android",
                            true, /* installIfNotAvailable */
                            "12"    /* minimumVersion */)
                    .build();

    Weitere Informationen zu ActionCodeSettings finden Sie im Abschnitt „Passing State in Email Actions“ .

  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.

    Kotlin+KTX

    Firebase.auth.sendSignInLinkToEmail(email, actionCodeSettings)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "Email sent.")
            }
        }

    Java

    FirebaseAuth auth = FirebaseAuth.getInstance();
    auth.sendSignInLinkToEmail(email, actionCodeSettings)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Email sent.");
                    }
                }
            });

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.

Abschließen der Anmeldung in einer Android-App

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.

Firebase Auth verwendet Firebase Dynamic Links beim Senden eines Links, der in einer mobilen Anwendung geöffnet werden soll. Um diese Funktion nutzen zu können, müssen dynamische Links in der Firebase-Konsole konfiguriert werden.

  1. Aktivieren Sie dynamische Firebase-Links:

    1. Öffnen Sie in der Firebase-Konsole den Abschnitt „Dynamische Links“ .
    2. Wenn Sie die Dynamic Links-Bedingungen noch nicht akzeptiert und keine Dynamic Links-Domäne erstellt haben, tun Sie dies jetzt.

      Wenn Sie bereits eine Dynamic Links-Domäne erstellt haben, notieren Sie sich dies. Eine Dynamic Links-Domäne sieht normalerweise wie im folgenden Beispiel aus:

      example.page.link

      Sie benötigen diesen Wert, wenn Sie Ihre Apple- oder Android-App so konfigurieren, dass sie den eingehenden Link abfängt.

  2. Konfigurieren von Android-Anwendungen:

    1. Um diese Links von Ihrer Android-Anwendung aus verarbeiten zu können, muss der Android-Paketname in den Projekteinstellungen der Firebase Console angegeben werden. Darüber hinaus müssen SHA-1 und SHA-256 des Anwendungszertifikats angegeben werden.
    2. Nachdem Sie nun eine dynamische Link-Domäne hinzugefügt und sichergestellt haben, dass Ihre Android-App korrekt konfiguriert ist, wird der dynamische Link ab der Launcher-Aktivität zu Ihrer Anwendung weitergeleitet.
    3. Wenn Sie möchten, dass der dynamische Link zu einer bestimmten Aktivität umleitet, müssen Sie einen Absichtsfilter in Ihrer AndroidManifest.xml- Datei konfigurieren. Dies kann entweder durch Angabe Ihrer Dynamic-Link-Domain oder des E-Mail-Aktionshandlers im Intent-Filter erfolgen. Standardmäßig wird der E-Mail-Aktionshandler auf einer Domäne wie im folgenden Beispiel gehostet:
      PROJECT_ID.firebaseapp.com/
    4. Vorbehalte:
      1. Geben Sie nicht die URL an, die Sie für actionCodeSettings in Ihrem Intent-Filter festgelegt haben.
      2. Beim Erstellen Ihrer Dynamic-Link-Domain haben Sie möglicherweise auch einen kurzen URL-Link erstellt. Diese Kurz-URL wird nicht weitergegeben; Konfigurieren Sie Ihren Intent-Filter nicht so, dass er ihn mit einem android:pathPrefix Attribut abfängt. Dies bedeutet, dass Sie in verschiedenen Teilen Ihrer Anwendung keine unterschiedlichen dynamischen Links abfangen können. Sie können jedoch den mode Abfrageparameter im Link überprüfen, um zu sehen, welcher Vorgang ausgeführt werden soll, oder SDK-Methoden wie isSignInWithEmailLink verwenden, um zu sehen, ob ein Link, den Ihre App erhalten hat, das tut, was Sie wollen.
    5. Weitere Informationen zum Empfang dynamischer Links finden Sie in der Anleitung zum Empfang dynamischer Android-Links .

Nachdem Sie den Link wie oben beschrieben erhalten haben, überprüfen Sie, ob er für die E-Mail-Link-Authentifizierung gedacht ist, und schließen Sie die Anmeldung ab.

Kotlin+KTX

val auth = Firebase.auth
val intent = intent
val emailLink = intent.data.toString()

// Confirm the link is a sign-in with email link.
if (auth.isSignInWithEmailLink(emailLink)) {
    // Retrieve this from wherever you stored it
    val email = "someemail@domain.com"

    // The client SDK will parse the code from the link for you.
    auth.signInWithEmailLink(email, emailLink)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "Successfully signed in with email link!")
                val result = task.result
                // You can access the new user via result.getUser()
                // Additional user info profile *not* available via:
                // result.getAdditionalUserInfo().getProfile() == null
                // You can check if the user is new or existing:
                // result.getAdditionalUserInfo().isNewUser()
            } else {
                Log.e(TAG, "Error signing in with email link", task.exception)
            }
        }
}

Java

FirebaseAuth auth = FirebaseAuth.getInstance();
Intent intent = getIntent();
String emailLink = intent.getData().toString();

// Confirm the link is a sign-in with email link.
if (auth.isSignInWithEmailLink(emailLink)) {
    // Retrieve this from wherever you stored it
    String email = "someemail@domain.com";

    // The client SDK will parse the code from the link for you.
    auth.signInWithEmailLink(email, emailLink)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Successfully signed in with email link!");
                        AuthResult result = task.getResult();
                        // You can access the new user via result.getUser()
                        // Additional user info profile *not* available via:
                        // result.getAdditionalUserInfo().getProfile() == null
                        // You can check if the user is new or existing:
                        // result.getAdditionalUserInfo().isNewUser()
                    } else {
                        Log.e(TAG, "Error signing in with email link", task.getException());
                    }
                }
            });
}

Weitere Informationen zum Umgang mit der Anmeldung per E-Mail-Link in einer Apple-Anwendung finden Sie im Apple-Plattformhandbuch .

Weitere Informationen zum Umgang mit der Anmeldung per E-Mail-Link in einer Webanwendung finden Sie im Web-Handbuch .

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:

Kotlin+KTX

// Construct the email link credential from the current URL.
val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink)

// Link the credential to the current user.
Firebase.auth.currentUser!!.linkWithCredential(credential)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d(TAG, "Successfully linked emailLink credential!")
            val result = task.result
            // You can access the new user via result.getUser()
            // Additional user info profile *not* available via:
            // result.getAdditionalUserInfo().getProfile() == null
            // You can check if the user is new or existing:
            // result.getAdditionalUserInfo().isNewUser()
        } else {
            Log.e(TAG, "Error linking emailLink credential", task.exception)
        }
    }

Java

// Construct the email link credential from the current URL.
AuthCredential credential =
        EmailAuthProvider.getCredentialWithLink(email, emailLink);

// Link the credential to the current user.
auth.getCurrentUser().linkWithCredential(credential)
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "Successfully linked emailLink credential!");
                    AuthResult result = task.getResult();
                    // You can access the new user via result.getUser()
                    // Additional user info profile *not* available via:
                    // result.getAdditionalUserInfo().getProfile() == null
                    // You can check if the user is new or existing:
                    // result.getAdditionalUserInfo().isNewUser()
                } else {
                    Log.e(TAG, "Error linking emailLink credential", task.getException());
                }
            }
        });

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

Kotlin+KTX

// Construct the email link credential from the current URL.
val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink)

// Re-authenticate the user with this credential.
Firebase.auth.currentUser!!.reauthenticateAndRetrieveData(credential)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            // User is now successfully reauthenticated
        } else {
            Log.e(TAG, "Error reauthenticating", task.exception)
        }
    }

Java

// Construct the email link credential from the current URL.
AuthCredential credential =
        EmailAuthProvider.getCredentialWithLink(email, emailLink);

// Re-authenticate the user with this credential.
auth.getCurrentUser().reauthenticateAndRetrieveData(credential)
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // User is now successfully reauthenticated
                } else {
                    Log.e(TAG, "Error reauthenticating", task.getException());
                }
            }
        });

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 sich ein Benutzer zum ersten Mal angemeldet hat, wird ein neues Benutzerkonto erstellt und mit den Anmeldeinformationen – also dem Benutzernamen und dem Kennwort, der Telefonnummer oder den Informationen zum Authentifizierungsanbieter – verknüpft, mit denen sich der Benutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann zur Identifizierung eines Benutzers in jeder App in Ihrem Projekt verwendet werden, unabhängig davon, wie sich der Benutzer anmeldet.

  • In Ihren Apps können Sie die grundlegenden Profilinformationen des Benutzers aus dem FirebaseUser 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 die Anmeldung bei Ihrer App mit mehreren Authentifizierungsanbietern ermöglichen, indem Sie die Anmeldeinformationen des Authentifizierungsanbieters mit einem vorhandenen Benutzerkonto verknüpfen.

Um einen Benutzer abzumelden, rufen Sie signOut auf:

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();