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. Benutzer sind über dieselbe Firebase-Benutzer-ID identifizierbar, unabhängig davon, mit welchem Authentifizierungsanbieter sie sich angemeldet haben. Beispielsweise kann ein Benutzer, der sich mit einem Passwort angemeldet hat, ein Google-Konto verknüpfen und sich in Zukunft mit einer der beiden Methoden anmelden. Oder ein anonymer Benutzer kann ein Facebook-Konto verknüpfen und sich später bei Facebook anmelden, um Ihre App weiterhin zu verwenden.
Bevor Sie beginnen
Fügen Sie Ihrer App Unterstützung für zwei oder mehr Authentifizierungsanbieter (möglicherweise einschließlich anonymer Authentifizierung) hinzu.
Verknüpfen Sie die Anmeldeinformationen des Verbundauthentifizierungsanbieters mit einem Benutzerkonto
So verknüpfen Sie Anmeldeinformationen von einem Authentifizierungsanbieter wie Google oder Facebook mit einem vorhandenen Benutzerkonto:
- Melden Sie den Benutzer mit einem beliebigen Authentifizierungsanbieter oder einer beliebigen Methode an.
- Rufen Sie das
AuthProvider
Objekt ab, das dem Anbieter entspricht, den Sie mit dem Benutzerkonto verknüpfen möchten. Beispiele:Web modular API
import { GoogleAuthProvider, FacebookAuthProvider, TwitterAuthProvider, GithubAuthProvider } from "firebase/auth"; const googleProvider = new GoogleAuthProvider(); const facebookProvider = new FacebookAuthProvider(); const twitterProvider = new TwitterAuthProvider(); const githubProvider = new GithubAuthProvider();
Web namespaced API
var googleProvider = new firebase.auth.GoogleAuthProvider(); var facebookProvider = new firebase.auth.FacebookAuthProvider(); var twitterProvider = new firebase.auth.TwitterAuthProvider(); var githubProvider = new firebase.auth.GithubAuthProvider();
- Fordern Sie den Benutzer auf, sich bei dem Anbieter anzumelden, den Sie verknüpfen möchten. Sie können Ihre Benutzer zur Anmeldung auffordern, indem Sie entweder ein Popup-Fenster öffnen oder zur Anmeldeseite des Anbieters weiterleiten. Auf Mobilgeräten wird die Weiterleitungsmethode bevorzugt.
- Um sich mit einem Popup-Fenster anzumelden, rufen Sie
linkWithPopup
auf:Web modular API
import { getAuth, linkWithPopup, GoogleAuthProvider } from "firebase/auth"; const provider = new GoogleAuthProvider(); const auth = getAuth(); linkWithPopup(auth.currentUser, provider).then((result) => { // Accounts successfully linked. const credential = GoogleAuthProvider.credentialFromResult(result); const user = result.user; // ... }).catch((error) => { // Handle Errors here. // ... });
Web namespaced API
auth.currentUser.linkWithPopup(provider).then((result) => { // Accounts successfully linked. var credential = result.credential; var user = result.user; // ... }).catch((error) => { // Handle Errors here. // ... });
- Um sich anzumelden, indem Sie zur Anmeldeseite des Anbieters umleiten, rufen Sie
linkWithRedirect
auf: Befolgen Sie die Best Practices bei der Verwendung von „linkWithRedirect“.Nachdem sich der Benutzer angemeldet hat, wird er zurück auf Ihre Seite weitergeleitet. Anschließend können Sie das Anmeldeergebnis abrufen, indem Sie beim Laden Ihrer SeiteWeb modular API
import { getAuth, linkWithRedirect, GoogleAuthProvider } from "firebase/auth"; const provider = new GoogleAuthProvider(); const auth = getAuth(); linkWithRedirect(auth.currentUser, provider) .then(/* ... */) .catch(/* ... */);
Web namespaced API
auth.currentUser.linkWithRedirect(provider) .then(/* ... */) .catch(/* ... */);
getRedirectResult
aufrufen:Web modular API
import { getRedirectResult } from "firebase/auth"; getRedirectResult(auth).then((result) => { const credential = GoogleAuthProvider.credentialFromResult(result); if (credential) { // Accounts successfully linked. const user = result.user; // ... } }).catch((error) => { // Handle Errors here. // ... });
Web namespaced API
auth.getRedirectResult().then((result) => { if (result.credential) { // Accounts successfully linked. var credential = result.credential; var user = result.user; // ... } }).catch((error) => { // Handle Errors here. // ... });
Die Kontoverknüpfung schlägt fehl, wenn die Anmeldeinformationen bereits mit einem anderen Benutzerkonto verknüpft sind. In dieser Situation müssen Sie die Konten und zugehörigen Daten entsprechend Ihrer App zusammenführen:
Web modular API
import { getAuth, signInWithCredential, linkWithCredential, OAuthProvider } from "firebase/auth"; // The implementation of how you store your user data depends on your application const repo = new MyUserDataRepo(); // Get reference to the currently signed-in user const auth = getAuth(); const prevUser = auth.currentUser; // Get the data which you will want to merge. This should be done now // while the app is still signed in as this user. const prevUserData = repo.get(prevUser); // Delete the user's data now, we will restore it if the merge fails repo.delete(prevUser); // Sign in user with the account you want to link to signInWithCredential(auth, newCredential).then((result) => { console.log("Sign In Success", result); const currentUser = result.user; const currentUserData = repo.get(currentUser); // Merge prevUser and currentUser data stored in Firebase. // Note: How you handle this is specific to your application const mergedData = repo.merge(prevUserData, currentUserData); const credential = OAuthProvider.credentialFromResult(result); return linkWithCredential(prevUser, credential) .then((linkResult) => { // Sign in with the newly linked credential const linkCredential = OAuthProvider.credentialFromResult(linkResult); return signInWithCredential(auth, linkCredential); }) .then((signInResult) => { // Save the merged data to the new user repo.set(signInResult.user, mergedData); }); }).catch((error) => { // If there are errors we want to undo the data merge/deletion console.log("Sign In Error", error); repo.set(prevUser, prevUserData); });
Web namespaced API
// The implementation of how you store your user data depends on your application var repo = new MyUserDataRepo(); // Get reference to the currently signed-in user var prevUser = auth.currentUser; // Get the data which you will want to merge. This should be done now // while the app is still signed in as this user. var prevUserData = repo.get(prevUser); // Delete the user's data now, we will restore it if the merge fails repo.delete(prevUser); // Sign in user with the account you want to link to auth.signInWithCredential(newCredential).then((result) => { console.log("Sign In Success", result); var currentUser = result.user; var currentUserData = repo.get(currentUser); // Merge prevUser and currentUser data stored in Firebase. // Note: How you handle this is specific to your application var mergedData = repo.merge(prevUserData, currentUserData); return prevUser.linkWithCredential(result.credential) .then((linkResult) => { // Sign in with the newly linked credential return auth.signInWithCredential(linkResult.credential); }) .then((signInResult) => { // Save the merged data to the new user repo.set(signInResult.user, mergedData); }); }).catch((error) => { // If there are errors we want to undo the data merge/deletion console.log("Sign In Error", error); repo.set(prevUser, prevUserData); });
- Um sich mit einem Popup-Fenster anzumelden, rufen Sie
Verknüpfen Sie E-Mail-Adresse und Passwort-Anmeldeinformationen mit einem Benutzerkonto
So fügen Sie E-Mail-Adresse und Passwort-Anmeldeinformationen zu einem vorhandenen Benutzerkonto hinzu:
- Melden Sie den Benutzer mit einem beliebigen Authentifizierungsanbieter oder einer beliebigen Methode an.
- Fordern Sie den Benutzer auf, eine E-Mail-Adresse und ein neues Passwort einzugeben.
- Erstellen Sie ein
AuthCredential
Objekt mit der E-Mail-Adresse und dem Passwort:Web modular API
import { EmailAuthProvider } from "firebase/auth"; const credential = EmailAuthProvider.credential(email, password);
Web namespaced API
var credential = firebase.auth.EmailAuthProvider.credential(email, password);
Übergeben Sie das
AuthCredential
Objekt an dielinkWithCredential
-Methode des angemeldeten Benutzers:Web modular API
import { getAuth, linkWithCredential } from "firebase/auth"; const auth = getAuth(); linkWithCredential(auth.currentUser, credential) .then((usercred) => { const user = usercred.user; console.log("Account linking success", user); }).catch((error) => { console.log("Account linking error", error); });
Web namespaced API
auth.currentUser.linkWithCredential(credential) .then((usercred) => { var user = usercred.user; console.log("Account linking success", user); }).catch((error) => { console.log("Account linking error", error); });
Der Aufruf von
linkWithCredential
schlägt fehl, wenn die Anmeldeinformationen bereits mit einem anderen Benutzerkonto verknüpft sind. In dieser Situation müssen Sie die Konten und zugehörigen Daten entsprechend Ihrer App zusammenführen (siehe Beispiel oben).
Heben Sie die Verknüpfung eines Authentifizierungsanbieters mit einem Benutzerkonto auf
Sie können die Verknüpfung eines Authentifizierungsanbieters mit einem Konto aufheben, sodass sich der Benutzer nicht mehr bei diesem Anbieter anmelden kann.
Um die Verknüpfung eines Authentifizierungsanbieters mit einem Benutzerkonto aufzuheben, übergeben Sie die Anbieter-ID an die unlink
Methode. Sie können die Anbieter-IDs der mit einem Benutzer verknüpften Authentifizierungsanbieter über die Eigenschaft providerData
abrufen.
Web modular API
import { getAuth, unlink } from "firebase/auth"; const auth = getAuth(); unlink(auth.currentUser, providerId).then(() => { // Auth provider unlinked from account // ... }).catch((error) => { // An error happened // ... });
Web namespaced API
user.unlink(providerId).then(() => { // Auth provider unlinked from account // ... }).catch((error) => { // An error happened // ... });