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
Richten Sie Ihr Android-Projekt ein
Fügen Sie Ihrem Android-Projekt Firebase hinzu, falls Sie dies noch nicht getan haben .
Fügen Sie in Ihrer Modul-Gradle-Datei (auf App-Ebene) (normalerweise
<project>/<app-module>/build.gradle
) die Abhängigkeit für die Firebase Authentication Android-Bibliothek hinzu. 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 SDK der Google Play-Dienste zu Ihrer App hinzufügen.
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.3') // 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-ktx'
// Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.4.1' }Durch die Verwendung der Firebase Android BoM verwendet Ihre App immer kompatible Versionen von 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, dass wir bei Verwendung mehrerer Firebase-Bibliotheken in Ihrer App dringend empfehlen, die BoM zum Verwalten von Bibliotheksversionen zu verwenden, wodurch sichergestellt wird, 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-ktx:21.1.0'
// Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.4.1' }Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.3') // 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:20.4.1' }Durch die Verwendung der Firebase Android BoM verwendet Ihre App immer kompatible Versionen von 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, dass wir bei Verwendung mehrerer Firebase-Bibliotheken in Ihrer App dringend empfehlen, die BoM zum Verwalten von Bibliotheksversionen zu verwenden, wodurch sichergestellt wird, 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:21.1.0'
// Also add the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.4.1' }
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:
- Öffnen Sie in der Firebase-Konsole den Abschnitt Auth .
- 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.
- Aktivieren Sie im selben Abschnitt die Anmeldemethode E-Mail-Link (kennwortlose Anmeldung) .
- Klicken Sie auf Speichern .
Senden Sie einen Authentifizierungslink an die E-Mail-Adresse des Benutzers
Präsentieren Sie dem Benutzer zum Initiieren des Authentifizierungsflusses eine Schnittstelle, die ihn 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.
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
undIOSBundleId
: Die zu verwendenden Apps, 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. 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.
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 E-Mail-Aktionen .
-
Fragen Sie den Benutzer nach seiner E-Mail-Adresse.
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.
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."); } } });
Schließen Sie die Anmeldung mit dem E-Mail-Link ab
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.
Abschließen der Anmeldung in einer Android-App
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.
Dynamische Firebase-Links konfigurieren
Firebase Auth verwendet Firebase Dynamic Links , wenn ein Link gesendet wird, 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.
Dynamische Firebase-Links aktivieren:
- Öffnen Sie in der Firebase-Konsole den Abschnitt Dynamische Links .
Wenn Sie die Bedingungen für dynamische Links noch nicht akzeptiert und eine Domäne für dynamische Links erstellt haben, tun Sie dies jetzt.
Wenn Sie bereits eine Domäne mit dynamischen Links erstellt haben, notieren Sie sich diese. Eine Domäne mit dynamischen Links 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.
Konfigurieren von Android-Anwendungen:
- Um diese Links von Ihrer Android-Anwendung verarbeiten zu können, muss der Android-Paketname in den Projekteinstellungen der Firebase Console angegeben werden. Außerdem müssen SHA-1 und SHA-256 des Anwendungszertifikats angegeben werden.
- Nachdem Sie nun eine Domäne mit dynamischem Link hinzugefügt und sichergestellt haben, dass Ihre Android-App korrekt konfiguriert ist, leitet der dynamische Link zu Ihrer Anwendung um, beginnend mit der Launcher-Aktivität.
- Wenn Sie möchten, dass der dynamische Link zu einer bestimmten Aktivität umleitet, müssen Sie einen Intent-Filter in Ihrer AndroidManifest.xml -Datei konfigurieren. Dies kann entweder durch Angabe Ihrer dynamischen Linkdomäne 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/
- Vorbehalte:
- Geben Sie nicht die URL an, die Sie in actionCodeSettings in Ihrem Intent-Filter festgelegt haben.
- Beim Erstellen Ihrer dynamischen Link-Domain haben Sie möglicherweise auch einen Kurz-URL-Link erstellt. Diese Kurz-URL wird nicht weitergegeben; Konfigurieren Sie Ihren Intent-Filter nicht , um ihn mit einem
android:pathPrefix
Attribut abzufangen. Dies bedeutet, dass Sie in verschiedenen Teilen Ihrer Anwendung keine unterschiedlichen dynamischen Links erkennen können. Sie können jedoch denmode
-Abfrageparameter im Link überprüfen, um zu sehen, welche Operation ausgeführt werden soll, oder SDK-Methoden wieisSignInWithEmailLink
, um zu sehen, ob ein Link, den Ihre App erhalten hat, das tut, was Sie wollen.
- Weitere Informationen zum Empfangen dynamischer Links finden Sie in der Anleitung zum Empfangen dynamischer Android-Links .
Link bestätigen und anmelden
Nachdem Sie den Link wie oben beschrieben erhalten haben, vergewissern Sie sich, dass er für die E-Mail-Link-Authentifizierung bestimmt 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 mit einem E-Mail-Link in einer Apple-Anwendung finden Sie im Apple-Plattformhandbuch .
Informationen zum Umgang mit der Anmeldung mit einem E-Mail-Link in einer Webanwendung finden Sie im Webleitfaden .
Verknüpfung/Neuauthentifizierung mit E-Mail-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:
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 eine vertrauliche Operation 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, 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.
E-Mail/Passwort von E-Mail-Link unterscheiden
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:
Kotlin+KTX
Firebase.auth.fetchSignInMethodsForEmail(email) .addOnSuccessListener { result -> val signInMethods = result.signInMethods!! if (signInMethods.contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD)) { // User can sign in with email/password } else if (signInMethods.contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD)) { // User can sign in with email/link } } .addOnFailureListener { exception -> Log.e(TAG, "Error getting sign in methods for user", exception) }
Java
auth.fetchSignInMethodsForEmail(email) .addOnCompleteListener(new OnCompleteListener<SignInMethodQueryResult>() { @Override public void onComplete(@NonNull Task<SignInMethodQueryResult> task) { if (task.isSuccessful()) { SignInMethodQueryResult result = task.getResult(); List<String> signInMethods = result.getSignInMethods(); if (signInMethods.contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD)) { // User can sign in with email/password } else if (signInMethods.contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD)) { // User can sign in with email/link } } else { Log.e(TAG, "Error getting sign in methods for user", task.getException()); } } });
Wie oben beschrieben, gelten E-Mail/Passwort und E-Mail/Link als derselbe EmailAuthProvider
(dieselbe PROVIDER_ID
) mit unterschiedlichen Anmeldemethoden.
Nächste Schritte
Nachdem sich ein Benutzer zum ersten Mal angemeldet hat, wird ein neues Benutzerkonto erstellt und mit den Anmeldeinformationen verknüpft – d. h. dem Benutzernamen und Kennwort, der Telefonnummer oder den Authentifizierungsanbieterinformationen –, mit denen sich der Benutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Benutzer in jeder App in Ihrem Projekt zu identifizieren, 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 Sicherheitsregeln für die Firebase-Echtzeitdatenbank und den Cloud-Speicher können Sie die eindeutige Benutzer-ID des angemeldeten Benutzers aus der Variablen
auth
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
:
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();