Есть ли способ включить вход через Facebook в учетную запись, которая была создана с помощью аутентификации Google с тем же адресом электронной почты (gmail)? - PullRequest
0 голосов
/ 09 июня 2019

Я столкнулся со странной проблемой, когда осуществлял вход в Google Expo и Facebook с аутентификацией Firebase.Примечания:

  1. Я могу создать новые учетные записи, выполнив вход с помощью Google и Facebook
  2. Используя адрес электронной почты, который является общим для Google и Facebook, если я сначала создал свою учетную записьподписавшись через Facebook, а затем войдя в систему после выхода из системы, я смогу получить доступ к той же учетной записи
  3. Но, с другой стороны, если я зарегистрируюсь в Google и выйду из системы ипопробуйте войти в систему через Facebook, я получаю сообщение об ошибке, вызванное вызовом firebase .auth () .signInWithCredential (credential): [Ошибка: учетная запись уже существует с тем же адресом электронной почты, но с другими учетными данными для входа.Войдите, используя провайдера, связанного с этим адресом электронной почты.]

TL: DR Зарегистрируйтесь с помощью Facebook, а затем войдите с помощью Google, используя тот же адрес электронной почты.Зарегистрируйтесь с помощью Google, а затем войдите с помощью Facebook выдает ошибку.Примечание. Я могу зарегистрироваться через Facebook, а затем войти в него через Facebook, если не изменю провайдера на Google, войдя в систему с помощью Google.

Почему провайдеру необходимоменять?Когда провайдером на консоли Firebase является Facebook, я могу получить доступ к учетной записи через логин Facebook.Теперь, когда я использую логин Google, провайдер меняется на Google, и он работает, но после этого логин Facebook больше не работает.Есть идеи?

Я уверен, что есть обходной путь, так как это может быть связано с тем, что Facebook не проверяет адреса электронной почты.Или, может быть, это как-то связано с тем, как учетные данные создаются в каждом методе.

Буду признателен за любую помощь.Спасибо за ваше время.

Вот мой метод обработки входа в Facebook:

_onFacebookSignIn = async facebookUser => {
const unsubscribe = firebase.auth().onAuthStateChanged(firebaseUser => {
  unsubscribe();
  // Check if we are already signed-in Firebase with the correct user.
  if (!this.isUserEqual(facebookUser, firebaseUser, 'facebook')) {
    // Build Firebase credential with the Facebook auth token.
    const credential = firebase.auth.FacebookAuthProvider.credential(
      facebookUser.token
    );
    console.log({ facebookCredential: credential });
    // Sign in with the credential from the Facebook user.
    firebase
      .auth()
      .signInWithCredential(credential)
      .then(result => {
        if (result.additionalUserInfo.isNewUser) {
          firebase
            .database()
            .ref('/users/' + result.user.uid)
            .set({
              email: result.user.email,
              profile_picture:
                result.additionalUserInfo.profile.picture.data.url,
              first_name: result.additionalUserInfo.profile.first_name,
              last_name: result.additionalUserInfo.profile.last_name,
              created_at: Date.now()
            })
            .then(snapshot => {
              console.log({ snapshot });
            });
        } else {
          firebase
            .database()
            .ref('/users/' + result.user.uid)
            .update({
              last_logged_in: Date.now()
            });
        }
      })
      .catch(error => {
        console.log({ error });
        this.setState({ loading: false });
      });
  } else {
    console.log('User already signed-in Firebase.');
  }
});
};

Обработчик входа в Google:

_onGoogleSignIn = async googleUser => {
// We need to register an Observer on Firebase Auth to make sure auth is initialized.
const unsubscribe = firebase.auth().onAuthStateChanged(firebaseUser => {
  unsubscribe();
  // Check if we are already signed-in Firebase with the correct user.
  if (!this.isUserEqual(googleUser, firebaseUser, 'google')) {
    // Build Firebase credential with the Google ID token.
    const credential = firebase.auth.GoogleAuthProvider.credential(
      googleUser.idToken,
      googleUser.accessToken
    );
    console.log({ googleCredential: credential });
    // Sign in with credential from the Google user.
    firebase
      .auth()
      .signInWithCredential(credential)
      .then(result => {
        if (result.additionalUserInfo.isNewUser) {
          firebase
            .database()
            .ref('/users/' + result.user.uid)
            .set({
              email: result.user.email,
              profile_picture: result.additionalUserInfo.profile.picture,
              first_name: result.additionalUserInfo.profile.given_name,
              last_name: result.additionalUserInfo.profile.family_name,
              created_at: Date.now()
            })
            .then(snapshot => {
              console.log({ snapshot });
            });
        } else {
          firebase
            .database()
            .ref('/users/' + result.user.uid)
            .update({
              last_logged_in: Date.now()
            });
        }
      })
      .catch(error => {
        console.log(error);
        this.setState({ loading: false });
      });
  } else {
    console.log('User already signed-in Firebase.');
  }
});
};

ПредоставленоПожарная документация (в основном)

...