Ir para o console

Vincular vários provedores de autenticação a uma conta usando JavaScript

Ao vincular as credenciais de provedores de autenticação a contas de usuário existentes, você permite que esses usuários façam login no seu app usando diferentes provedores. O código do Firebase identifica usuários de qualquer provedor de login. Por exemplo, um usuário que fez login com uma senha pode vincular uma conta do Google e usar um desses métodos. Ou um usuário anônimo pode vincular uma conta do Facebook para acessar o app.

Antes de começar

Adicione ao app o suporte para dois ou mais provedores de autenticação, possivelmente incluindo autenticação anônima.

Vincular credenciais de provedor de autenticação federado a uma conta de usuário

Siga estas etapas para vincular credenciais de um provedor de autenticação, como o Google ou Facebook, a uma conta de usuário existente:

  1. Faça login usando qualquer provedor ou método de autenticação.
  2. Consiga o objeto AuthProvider correspondente ao provedor que você deseja vincular à conta do usuário. Exemplos:
    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. Solicite que o usuário faça login com o provedor que você quer vincular. Você pode solicitar que os usuários façam login por meio de uma janela pop-up ou redirecionando-os à página de login do provedor. O método de redirecionamento é recomendável para dispositivos móveis.
    • Para fazer login com uma janela pop-up, chame 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 fazer login por meio do redirecionamento à página de login do provedor, chame linkWithRedirect:
      auth.currentUser.linkWithRedirect(provider);
      
      Após usar os métodos de login, os usuários serão redirecionados novamente à sua página. Depois disso, você pode recuperar o resultado do login chamando getRedirectResult quando sua página for carregada:
      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.
        // ...
      });
      
    Se o usuário fizer login corretamente, a conta do usuário com o provedor ficará vinculada à conta do usuário no seu projeto do Firebase.

    A vinculação de contas falhará se as credenciais já estiverem vinculadas a outra conta de usuário. Nesse caso, você precisará mesclar as contas e os dados associados da maneira apropriada para o 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);
    });
    

Vincular credenciais de endereço de e-mail e senha a uma conta de usuário

Siga estas etapas para adicionar credenciais de endereço de e-mail e senha a uma conta existente:

  1. Faça login usando qualquer provedor ou método de autenticação.
  2. Solicite que o usuário insira e-mail e uma nova senha.
  3. Crie um objeto AuthCredential com endereço de e-mail e senha:
    var credential = firebase.auth.EmailAuthProvider.credential(email, password);
    
  4. Envie o objeto AuthCredential para o método linkWithCredential do usuário conectado:

    
    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);
    });
    

    A chamada ao linkWithCredential não funciona com credenciais já vinculadas a outra conta de usuário. Nesse caso, você precisará mesclar as contas e os dados associados da maneira apropriada para o 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);
    });
    

Desvincular um provedor de autenticação de uma conta de usuário

É possível desvincular um provedor de autenticação de uma conta para que o usuário não faça mais login com ele.

Para desvincular um provedor de uma conta de usuário, passe o código dele para o método unlink. Você pode receber os códigos dos provedores de autenticação vinculados a um usuário pela propriedade providerData.

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