Cómo vincular varios proveedores de autenticación con una cuenta mediante JavaScript

Para permitir que los usuarios accedan a tu app con varios proveedores de autenticación, puedes vincular las credenciales de proveedores de autenticación con una cuenta de usuario existente. Los usuarios se pueden identificar por el mismo ID de usuario de Firebase, sin importar el proveedor de autenticación que hayan usado para acceder. Por ejemplo, un usuario que accedió con una contraseña puede vincular una cuenta de Google y después usar cualquiera de los dos métodos para acceder. Por otra parte, un usuario anónimo puede vincular una cuenta de Facebook y luego acceder con Facebook para continuar usando tu app.

Antes de comenzar

Agrega compatibilidad para dos o más proveedores de autenticación (posiblemente incluida la autenticación anónima) a tu app.

Vincula credenciales federadas de proveedores de autenticación con una cuenta de usuario

Para vincular credenciales de un proveedor de autenticación como Google o Facebook con una cuenta de usuario existente, haz lo siguiente:

  1. Inicia la sesión del usuario con cualquier proveedor o método de autenticación.
  2. Obtén el objeto AuthProvider que corresponde al proveedor que deseas vincular con la cuenta del usuario. Ejemplos:
    var provider = new firebase.auth.GoogleAuthProvider();
    var provider = new firebase.auth.FacebookAuthProvider();
    var provider = new firebase.auth.TwitterAuthProvider();
    var provider = new firebase.auth.GithubAuthProvider();
    
  3. Solicita al usuario que acceda con el proveedor que deseas vincular. Para pedir a tus usuarios que accedan, puedes mostrar una ventana emergente o redireccionarlos a la página de acceso del proveedor. En dispositivos móviles, se prefiere el método de redireccionamiento.
    • Para acceder con una ventana emergente, llama a linkWithPopup:
      auth.currentUser.linkWithPopup(provider).then(function(result) {
        // Accounts successfully linked.
        var credential = result.credential;
        var user = result.user;
        // ...
      }).catch(function(error) {
        // Handle Errors here.
        // ...
      });
      
    • Para acceder mediante el redireccionamiento a la página de acceso del proveedor, llama a linkWithRedirect:
      auth.currentUser.linkWithRedirect(provider);
      
      Después de que el usuario accede, se lo redirecciona de vuelta a tu página. Luego, para recuperar el resultado del acceso, puedes llamar a getRedirectResult cuando tu página carga:
      firebase.auth().getRedirectResult().then(function(result) {
        if (result.credential) {
          // Accounts successfully linked.
          var credential = result.credential;
          var user = result.user;
          // ...
        }
      }).catch(function(error) {
        // Handle Errors here.
        // ...
      });
      
    Si el usuario accede correctamente, la cuenta del usuario correspondiente al proveedor se vincula con la cuenta del usuario en tu proyecto de Firebase.

    La vinculación de cuentas fallará si las credenciales ya se vincularon con la cuenta de otro usuario. En esta situación, debes administrar la fusión de las cuentas y los datos asociados según corresponda para tu app:

    // Get reference to the currently signed-in user
    var prevUser = auth.currentUser;
    // Sign in user with another account
    auth.signInWithCredential(credential).then(function(user) {
      console.log("Sign In Success", user);
      var currentUser = user;
      // Merge prevUser and currentUser data stored in Firebase.
      // Note: How you handle this is specific to your application
    
      // After data is migrated delete the duplicate user
      return user.delete().then(function() {
        // Link the OAuth Credential to original account
        return prevUser.linkWithCredential(credential);
      }).then(function() {
        // Sign in with the newly linked credential
        return auth.signInWithCredential(credential);
      });
    }).catch(function(error) {
      console.log("Sign In Error", error);
    });
    

Vincula credenciales de dirección de correo electrónico y contraseña con una cuenta de usuario

Para agregar credenciales de dirección de correo electrónico y contraseña a una cuenta de usuario existente, haz lo siguiente:

  1. Inicia la sesión del usuario con cualquier proveedor o método de autenticación.
  2. Pide al usuario una dirección de correo electrónico y una contraseña nueva.
  3. Crea un objeto AuthCredential con la dirección de correo electrónico y la contraseña:
    var credential = firebase.auth.EmailAuthProvider.credential(email, password);
    
  4. Pasa el objeto AuthCredential al método linkWithCredential del usuario que accedió:

    
    firebase.auth().currentUser.linkAndRetrieveDataWithCredential(credential).then(function(usercred) {
      var user = usercred.user;
      console.log("Account linking success", user);
    }, function(error) {
      console.log("Account linking error", error);
    });
    

    La llamada a linkWithCredential fallará si las credenciales ya se vincularon con la cuenta de otro usuario. En esta situación, debes administrar la fusión de las cuentas y los datos asociados según corresponda para tu app:

    // Get reference to the currently signed-in user
    var prevUser = auth.currentUser;
    // Sign in user with another account
    auth.signInWithCredential(credential).then(function(user) {
      console.log("Sign In Success", user);
      var currentUser = user;
      // Merge prevUser and currentUser data stored in Firebase.
      // Note: How you handle this is specific to your application
    
      // After data is migrated delete the duplicate user
      return user.delete().then(function() {
        // Link the OAuth Credential to original account
        return prevUser.linkWithCredential(credential);
      }).then(function() {
        // Sign in with the newly linked credential
        return auth.signInWithCredential(credential);
      });
    }).catch(function(error) {
      console.log("Sign In Error", error);
    });
    

Desvincula un proveedor de autenticación de una cuenta de usuario

Puedes desvincular un proveedor de autenticación de una cuenta, de forma que el usuario ya no pueda acceder con ese proveedor.

Para desvincular un proveedor de autenticación de una cuenta de usuario, pasa el ID del proveedor al método unlink. Puedes obtener los ID de los proveedores de autenticación vinculados a un usuario desde la propiedad providerData.

user.unlink(providerId).then(function() {
  // Auth provider unlinked from account
}).catch(function(error) {
  // An error happened
});

Enviar comentarios sobre...

Si necesitas ayuda, visita nuestra página de asistencia.