Google is committed to advancing racial equity for Black communities. See how.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Свяжите несколько поставщиков аутентификации с учетной записью с помощью JavaScript

Вы можете разрешить пользователям входить в ваше приложение с использованием нескольких поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя. Пользователи идентифицируются по одному и тому же идентификатору пользователя Firebase независимо от поставщика аутентификации, который они использовали для входа. Например, пользователь, который вошел в систему с паролем, может связать учетную запись Google и войти в систему любым методом в будущем. Или анонимный пользователь может связать учетную запись Facebook, а затем войти в систему через Facebook, чтобы продолжить использование вашего приложения.

Прежде чем вы начнете

Добавьте в свое приложение поддержку двух или более провайдеров аутентификации (возможно, включая анонимную аутентификацию).

Чтобы связать учетные данные от поставщика аутентификации, такого как Google или Facebook, с существующей учетной записью пользователя:

  1. Войдите в систему, используя любой провайдер или метод аутентификации.
  2. Получите объект AuthProvider , соответствующий поставщику, которого вы хотите связать с учетной записью пользователя. Примеры:
    var googleProvider = new firebase.auth.GoogleAuthProvider();
    var facebookProvider = new firebase.auth.FacebookAuthProvider();
    var twitterProvider = new firebase.auth.TwitterAuthProvider();
    var githubProvider = new firebase.auth.GithubAuthProvider();
  3. Предложите пользователю войти в систему с провайдером, которого вы хотите связать. Вы можете предложить своим пользователям войти в систему, открыв всплывающее окно или перенаправив на страницу входа поставщика. На мобильных устройствах предпочтительнее использовать метод перенаправления.
    • Чтобы войти в систему во всплывающем окне, позвоните по 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.
        // ...
      });
      .
    • Чтобы войти в систему путем перенаправления на страницу входа поставщика, вызовите linkWithRedirect :
      auth.currentUser.linkWithRedirect(provider)
        .then(/* ... */)
        .catch(/* ... */);
      После входа пользователя в систему они будут перенаправлены обратно на вашу страницу. Затем вы можете получить результат входа, вызвав getRedirectResult при getRedirectResult страницы:
      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.
        // ...
      });
    Если пользователь успешно вошел в систему, учетная запись пользователя у поставщика будет связана с учетной записью пользователя в вашем проекте Firebase.

    Связь учетной записи не удастся, если учетные данные уже связаны с другой учетной записью пользователя. В этой ситуации вы должны обработать объединение учетных записей и связанных данных в соответствии с вашим приложением:

    // 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(function(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(function(linkResult) {
          // Sign in with the newly linked credential
          return auth.signInWithCredential(linkResult.credential);
        })
        .then(function(signInResult) {
          // Save the merged data to the new user
          repo.set(signInResult.user, mergedData);
        });
    }).catch(function(error) {
      // If there are errors we want to undo the data merge/deletion
      console.log("Sign In Error", error);
      repo.set(prevUser, prevUserData);
    });

Чтобы добавить адрес электронной почты и пароль к существующей учетной записи пользователя:

  1. Войдите в систему, используя любой провайдер или метод аутентификации.
  2. Запрашивать у пользователя адрес электронной почты и новый пароль.
  3. Создайте объект AuthCredential с адресом электронной почты и паролем:
    var credential = firebase.auth.EmailAuthProvider.credential(email, password);
  4. Пропустите AuthCredential объект на зарегистрированны пользователя linkWithCredential метода:

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

    Вызов linkWithCredential завершится ошибкой, если учетные данные уже связаны с другой учетной записью пользователя. В этой ситуации вы должны обработать объединение учетных записей и связанных данных в соответствии с вашим приложением (см. Пример выше).

Вы можете отключить поставщика аутентификации от учетной записи, чтобы пользователь больше не мог входить в систему с этим поставщиком.

Чтобы отменить связь поставщика аутентификации с учетной записью пользователя, передайте идентификатор поставщика методу unlink . Вы можете получить идентификаторы поставщиков аутентификации, связанных с пользователем, из свойства providerData .

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