Получение «undefined» из error.email при попытке связать несколько провайдеров аутентификации в firebase - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь связать несколько провайдеров авторизации с одной учетной записью, используя firebase. Пользователь пытается создать учетную запись с тем же адресом, что и учетная запись Google OAuth, которая уже находится на firebase.


firebase
.auth()
.createUserWithEmailAndPassword(email, password)
.then(async result => {
    if (result.additionalUserInfo.isNewUser) {
        firebase
            .database()
            .ref('/users/' + result.user.uid)
            .set({
                email: email,
                profile_picture: image,
                first_name: firstName,
                last_name: lastName,
                created_at: Date.now()
            })
            .then(snapshot => console.log("do something"))
    } else {
        firebase
            .database()
            .ref('/users/' + result.user.uid)
            .update({
                last_logged_in: Date.now()
            })
            .then(snapshot => console.log("do something"))
    }
})
.catch(error => {
    if (error.code === 'auth/email-already-in-use' || error.code === 'auth/credential-already-in-use' || error.code === 'auth/account-exists-with-different-credential') {
        const pendingCred = error.credential
        const email = error.email
        firebase
            .auth()
            .fetchSignInMethodsForEmail(email)
            .then(methods => {
                switch (methods[0]) {
                    case 'password':
                        // email and password logic
                        break;
                    case 'facebook.com':
                        // facebook logic
                        break;
                    default:
                        break;
                }
            })
        return;
    }
})

Проблема в том, что я получаю правильное сообщение об ошибке:

[Ошибка: адрес электронной почты уже используется другой учетной записью.]

и правильный error.code:

auth / email-Уже -in-use

но, pendingCred или error.email возвращаться undefined.

Обновление
Я принял совет и попробовал следующее:

firebase.auth()
    .EmailAuthProvider
    .credential(email, password)
    .then(result => console.log("result", result))
    .catch(error => console.log(error))

Я получаю сообщение об ошибке:

[TypeError: undefined не является объектом (оценка '_firebase.default.auth (). EmailAuthProvider.credential ')]

1 Ответ

1 голос
/ 19 января 2020

Вы используете createuserwithEmailAndPassword, который не содержит error.email или error.credential. Согласно документации, чтобы получить ошибку, вы можете использовать error.message или error.code:

firebase.auth().createUserWithEmailAndPassword(email, password)
    .catch(function(error) {
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
  if (errorCode == 'auth/weak-password') {
    alert('The password is too weak.');
  } else {
    alert(errorMessage);
  }
  console.log(error);
});

Согласно документации, error.email и error.credential используется, если вы получаете следующую ошибку код:

auth/credential-already-in-use
auth/account-exists-with-different-credential

https://firebase.google.com/docs/reference/js/firebase.auth.Auth#error -коды_5

https://firebase.google.com/docs/reference/js/firebase.auth.Auth.html#sign с учетными данными

...