Über einen E-Mail-Link in Android mit 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:

  • Reibungslose 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 eines merken zu müssen. Das kann auf einem Mobilgerät umständlich sein.
  • Ein bestehender Nutzer, der sich zuvor mit einer E‑Mail-Kennung (Passwort oder Verbundanmeldung) 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

Android-Projekt einrichten

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

  2. Fügen Sie in der Gradle-Datei Ihres Moduls (auf App-Ebene) (in der Regel <project>/<app-module>/build.gradle.kts oder <project>/<app-module>/build.gradle) die Abhängigkeit für die Firebase Authentication-Bibliothek für Android hinzu. Wir empfehlen, die Firebase Android BoM zu verwenden, um die Versionsverwaltung der Bibliothek zu steuern.

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

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:35.0.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:22.0.0")
    }

    Mit der Firebase Android BoM haben Sie immer eine kompatible Version der Firebase Android-Bibliotheken in Ihrer App.

    (Alternative)  Firebase-Bibliotheksabhängigkeiten ohne Verwendung von BoM hinzufügen

    Wenn Sie die Firebase BoM nicht verwenden möchten, müssen Sie die Version jeder Firebase-Bibliothek in der entsprechenden Abhängigkeitszeile angeben.

    Wenn Sie mehrere Firebase-Bibliotheken in Ihrer App verwenden, empfehlen wir dringend, die BoM zum Verwalten von 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:25.0.0")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:22.0.0")
    }

E-Mail-Link-Anmeldung für Ihr Firebase-Projekt aktivieren

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. Wechseln Sie in der Firebase-Konsole zu Sicherheit > Authentifizierung.

  2. Aktivieren Sie auf dem Tab Anmeldemethode den Anmeldeanbieter E-Mail/Passwort. Die Anmeldung per E‑Mail-Link kann nur verwendet werden, wenn die Anmeldung per E‑Mail-Adresse und Passwort aktiviert ist.

  3. Aktivieren Sie im selben Bereich den Anmeldeanbieter E‑Mail-Link (Anmeldung ohne Passwort).

  4. Klicken Sie auf Speichern.

Um den Authentifizierungsablauf zu starten, präsentieren Sie dem Nutzer eine Benutzeroberfläche, in der er aufgefordert wird, seine E‑Mail-Adresse anzugeben. Rufen Sie dann sendSignInLinkToEmail auf, 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. Fügen Sie die Domain des Links der Liste der autorisierten Domains hinzu, falls noch nicht geschehen:

      1. Rufen Sie in der Firebase-Konsole den Tab Sicherheit > Authentifizierung > Einstellungen auf.

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

      Der Nutzer wird über den Link an diese URL weitergeleitet, wenn die App nicht auf seinem Gerät installiert ist und nicht installiert werden konnte.

    • androidPackageName und iOSBundleId: Damit kann Firebase Authentication ermitteln, ob ein reiner Weblink oder ein mobiler Link erstellt werden soll, der auf einem Android- oder Apple-Gerät geöffnet wird.
    • handleCodeInApp: Auf „true“ festlegen. Die Anmeldung muss immer in der App erfolgen, anders als bei 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.
    • linkDomain: Wenn benutzerdefinierte Hosting-Linkdomains für ein Projekt definiert sind, geben Sie an, welche verwendet werden soll, wenn der Link von einer bestimmten mobilen App geöffnet werden soll. Andernfalls wird automatisch die Standarddomain ausgewählt (z. B. PROJECT_ID.firebaseapp.com).
    • dynamicLinkDomain: Eingestellt. Geben Sie diesen Parameter nicht an.

    Kotlin

    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 Status in E-Mail-Aktionen übergeben.

  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 für den Fall, dass der Nutzer die E‑Mail-Anmeldung auf demselben Gerät abschließt.

    Kotlin

    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

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 Authentication 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 dann diese Adresse, um den Vorgang abzuschließen. Geben Sie die E-Mail-Adresse des Nutzers nicht in den Parametern der Weiterleitungs-URL an und verwenden Sie sie nicht wieder, da dies Session-Injections 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 dieses 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 in einer Android-App abschließen

Firebase Authentication verwendet Firebase Hosting, um den E‑Mail-Link an ein Mobilgerät zu senden. Damit die Anmeldung über eine mobile Anwendung abgeschlossen werden kann, muss die Anwendung so konfiguriert sein, dass sie den eingehenden Anwendungslink erkennt, den zugrunde liegenden Deeplink parst und die Anmeldung dann abschließt. Weitere Informationen finden Sie in der Dokumentation zu Android-App-Links.

Firebase Hosting konfigurieren

Firebase Authentication verwendet Firebase Hosting-Domains, wenn ein Link erstellt und gesendet wird, der in einer mobilen App geöffnet werden soll. Für Sie wurde bereits eine Standarddomain für Firebase Hosting konfiguriert.

  1. Firebase Hosting-Domains konfigurieren:

    Rufen Sie in der Firebase-Konsole Hosting & Serverless > Hosting auf.

    • Wenn Sie die Standarddomain für den E‑Mail-Link verwenden möchten, der in mobilen Apps geöffnet wird, rufen Sie Ihre Standardwebsite auf und notieren Sie sich Ihre Standarddomain Hosting. Eine Standarddomain vom Typ Hosting sieht in der Regel so aus: PROJECT_ID.firebaseapp.com.

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

    • Wenn Sie eine benutzerdefinierte Domain für den E‑Mail-Link verwenden möchten, können Sie eine bei Firebase Hosting registrieren und für die Domain des Links verwenden.

  2. Android-Anwendungen konfigurieren:

    Damit diese Links von Ihrer Android-App verarbeitet werden können, muss der Paketname Ihrer App in den Projekteinstellungen der Firebase-Konsole angegeben werden. Außerdem müssen der SHA‑1- und der SHA‑256-Fingerabdruck des Anwendungszertifikats angegeben werden.

    Wenn diese Links zu einer bestimmten Aktivität weiterleiten sollen, müssen Sie in Ihrer AndroidManifest.xml-Datei einen Intent-Filter konfigurieren. Der Intent-Filter sollte E‑Mail-Links Ihrer Domain erfassen. In AndroidManifest.xml:

    <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.BROWSABLE" />
      <category android:name="android.intent.category.DEFAULT" />
      <data
        android:scheme="https"
        android:host="<PROJECT_ID>.firebaseapp.com or your custom domain"
        android:pathPrefix="/__/auth/links" />
    </intent-filter>
    

    Wenn Nutzer einen Hosting-Link mit dem Pfad /__/auth/links und dem von Ihnen angegebenen Schema und Host öffnen, startet Ihre App die Aktivität mit diesem Intent-Filter, um den Link zu verarbeiten.

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

Kotlin

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 mit E‑Mail-Link in einer Apple-Anwendung finden Sie im Leitfaden für Apple-Plattformen.

Informationen zum Verarbeiten der Anmeldung mit E‑Mail-Link in einer Webanwendung finden Sie im Webleitfaden.

Sie können diese Authentifizierungsmethode auch mit einem vorhandenen Nutzer verknüpfen. Ein Nutzer, der sich zuvor mit einem anderen Anbieter authentifiziert hat, z. B. mit einer Telefonnummer, kann diese Anmeldemethode seinem bestehenden Konto hinzufügen.

Der Unterschied liegt in der zweiten Hälfte des Vorgangs:

Kotlin

// 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 Nutzer mit E-Mail-Link neu zu authentifizieren, bevor ein sensibler Vorgang ausgeführt wird.

Kotlin

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

Die E‑Mail-Link-Authentifizierung basierte bisher auf Firebase Dynamic Links, das am 25. August 2025 eingestellt wird.

Wir haben eine alternative Lösung im Firebase Authentication Android SDK ab Version 23.2.0 und im Firebase BoM ab Version 33.9.0 veröffentlicht.

Wenn Ihre App die alten Links verwendet, sollten Sie sie auf das neue Firebase Hosting-basierte System umstellen.

Wenn Sie Ihr Projekt am oder nach dem 15. September 2023 erstellt haben, ist der Schutz vor E‑Mail-Aufzählung 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 sich ein Nutzer zum ersten Mal anmeldet, wird ein neues Nutzerkonto erstellt und mit den Anmeldedaten verknüpft, mit denen sich der Nutzer angemeldet hat, also mit dem Nutzernamen und Passwort, der Telefonnummer oder den Informationen des Authentifizierungsanbieters. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Nutzer in allen Apps Ihres Projekts zu identifizieren, unabhängig davon, wie sich der Nutzer anmeldet.

  • In Ihren Apps können Sie die grundlegenden Profilinformationen des Nutzers aus dem FirebaseUser-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 auth-Variablen 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:

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();