Gestion des comptes de liaison dans Firebase

Je suis en train de suivre les instructions de Firebase sur la connexion sociale. Voici un exemple de ce que j'utilise et tout fonctionne bien dans une perspective d'authentification de connexion.

J'ai cependant, à la fois Google et Facebook login fonctionnant indépendamment.

Ce que je voudrais maintenant pouvoir faire, c'est de lier les comptes. Vous pouvez voir ci-dessous en fait où cela pourrait aller ( voir le commentaire ):

Si vous utilisez plusieurs fournisseurs d'authentification sur votre application, vous devez gérer la connexion des comptes de l'utilisateur ici.

J'ai essayé de nombreuses variantes de ce que je pense devrait aller ici, mais sans succès. Est-ce que quelqu'un peut me guider par rapport à ce qu'ils pensent être ici? Merci!

function initFBApp() { // Result from Redirect auth flow. // [START getidptoken] firebase.auth().getRedirectResult().then(function (result) { if (result.credential) { // This gives you a Facebook Access Token. You can use it to access the Facebook API. var token = result.credential.accessToken; // [START_EXCLUDE] document.getElementById('FBquickstart-oauthtoken').textContent = token; } else { document.getElementById('FBquickstart-oauthtoken').textContent = 'null'; // [END_EXCLUDE] } // The signed-in user info. var user = result.user; }).catch(function (error) { // Handle Errors here. var errorCode = error.code; var errorMessage = error.message; // The email of the user's account used. var email = error.email; // The firebase.auth.AuthCredential type that was used. var credential = error.credential; // [START_EXCLUDE] if (errorCode === 'auth/account-exists-with-different-credential') { alert('You have already signed up with a different auth provider for that emails.'); // If you are using multiple auth providers on your app you should handle linking // the user's accounts here. } else { console.error(error); } // [END_EXCLUDE] }); // [END getidptoken] // Listening for auth state changes. // [START authstatelistener] firebase.auth().onAuthStateChanged(function (user) { if (user) { // User is signed in. var displayName = user.displayName; var email = user.email; var emailVerified = user.emailVerified; var photoURL = user.photoURL; var isAnonymous = user.isAnonymous; var uid = user.uid; var providerData = user.providerData; // [START_EXCLUDE] document.getElementById('FBquickstart-sign-in-status').textContent = 'Signed in'; document.getElementById('FBquickstart-sign-in').textContent = 'Log out'; document.getElementById('FBquickstart-account-details').textContent = JSON.stringify(user, null, ' '); // [END_EXCLUDE] } else { // User is signed out. // [START_EXCLUDE] document.getElementById('FBquickstart-sign-in-status').textContent = 'Signed out'; document.getElementById('FBquickstart-sign-in').textContent = 'Log in with Facebook'; document.getElementById('FBquickstart-account-details').textContent = 'null'; document.getElementById('FBquickstart-oauthtoken').textContent = 'null'; // [END_EXCLUDE] } // [START_EXCLUDE] document.getElementById('FBquickstart-sign-in').disabled = false; // [END_EXCLUDE] }); // [END authstatelistener] document.getElementById('FBquickstart-sign-in').addEventListener('click', toggleFBSignIn, false); } 

Il s'agit approximativement des étapes sur la façon de gérer auth / account-exists-with-different-credential: Vous obtiendrez cette erreur si vous vous connectez à un nouveau compte Facebook qui utilise le courrier électronique d'un autre compte qui existe déjà. Disons que le compte existant est un compte Google.

Vous obtiendrez cette erreur dans getRedirectResult().catch(function(error) {})

L'erreur contiendra également un champ de courrier électronique et d'accréditation. Vous devrez enregistrer les informations d'identification (en utilisant la session de session recommandée). Vérifiez cette publication pour en savoir plus sur: Authentification Firebase Javascript: setCookie pour l'accréditation en attente de redirection

Vous appelez ensuite firebase.auth().fetchProvidersForEmail(error.email) pour déterminer les fournisseurs qui existent déjà pour ce courrier électronique.

Vous allez ensuite vous connecter à l'un de ces fournisseurs existants et affirmer que le courrier électronique est identique à error.email. En cas de succès, vous chargez les informations d'identification en attente de sessionStorage, réinitialisez-le comme décrit dans l'autre publication et liez-le à l'utilisateur actuel:

 firebase.auth().currentUser.link(savedCred); 

Vous aurez maintenant les deux comptes liés. Gardez à l'esprit que le fournisseur existant pourrait être un type de mot de passe. Dans ce cas, vous n'avez pas besoin d'enregistrer les informations d'identification, vous devez simplement demander à l'utilisateur le mot de passe et les signer en utilisant le même message d'erreur de messagerie. Vous pouvez alors appeler directement le lien avec l'erreur.credential.

BTW, je recommande firebaseui-web qui prend en charge tout cela pour vous: https://github.com/firebase/firebaseui-web

Je pense que l'API Firebase a changé un peu et firebase.auth().currentUser.link(savedCred); Est maintenant firebase.auth().currentUser.linkWithRedirect(provider) . Dans ma mise en œuvre, je sauvegarde le fournisseur initialement sélectionné dans sessionStorage et j'utilise cela avec la méthode ci-dessus au cas où une liaison de compte est requise.

Vous pouvez également utiliser linkWithPopUp si cela correspond mieux à vos besoins.