#javascript #firebase #firebase-authentication
# #javascript #firebase #firebase-аутентификация
Вопрос:
Я следовал этому руководству о том, как связать существующие учетные данные с новыми учетными данными из Facebook, и все работает должным образом, за исключением последней части, которая связывает пользователя с новыми учетными данными, я продолжаю получать ошибку «user.linkWithCredential не является функцией».
Вот мой код:
$(document).on('click', "#btn-login-fb", function (event) {
//A bunch of code here where I do the login process
}).catch(function (error) {
//Here is where I need to handle the error and link accounts
var errorCode = error.code;
var errorMessage = error.message;
// The email of the user's account used.
var email = error.email;
// The firebase.auth.AuthCredential type that was used.
var credential = error.credential;
//
// LINKING FACEBOOK WITH EXISTING EMAIL/PASSWORD USER
//
if (error.code === 'auth/account-exists-with-different-credential') {
// Step 2.
// User's email already exists.
// The pending Facebook credential.
var pendingCred = error.credential;
// The provider account's email address.
var email = error.email;
// Get sign-in methods for this email.
firebase.auth().fetchSignInMethodsForEmail(email).then(function (methods) {
// Step 3.
// If the user has several sign-in methods,
// the first method in the list will be the "recommended" method to use.
if (methods[0] === 'password') {
// Asks the user their password.
// In real scenario, you should handle this asynchronously.
//Abrir modal
document.getElementById("btnPwModal").click();
$(document).on('click', "#btnConfirmPw", function (event) {
document.getElementById("btnFecharModal").click();
var password = $("#inputPassword").val();
firebase.auth().signInWithEmailAndPassword(email, password).then(function (user) {
// Step 4a.
user.linkWithCredential(pendingCred).then(function () {
alert("linko");
// Facebook account successfully linked to the existing Firebase user.
});;
});
})
}
});
}
});
});
Есть идеи о том, почему все остальное работает, а linkWithCredential — нет? Спасибо.
Комментарии:
1. Используйте
console.log(..)
для отладки вашего кода; убедитесь, что порядок, в котором все происходит, соответствует ожидаемому (назначение прослушивателей событий в середине потока аутентификации ветвления кажется странным), и убедитесь, что переменные содержат то, что вы ожидаете2. Я не мог найти другого способа получения пароля в модальном режиме, в котором пользователь вводит свой пароль, поэтому я выполнил обходной путь слушателя, кроме того, кажется, что мой объект user после signInWithEmailAndPassword равен null или что-то в этом роде, потому что каждое свойство не определено для пользователя.
Ответ №1:
То, что вы получаете после вызова signInWithEmailAndPassword
, является UserCredential
объектом, а не User
объектом. Чтобы получить от UserCredential
до `, вы вызываете user
его.
Итак:
firebase.auth().signInWithEmailAndPassword(email, password).then(function (cred) {
cred.user.linkWithCredential(pendingCred)...
Комментарии:
1. Спасибо за подтверждение. Спасибо за предоставление обратной ссылки! Вы не первый, у кого возникла эта проблема, и со ссылкой мы, наконец, знаем, откуда берется путаница. Мы также скоро исправим это, так что, надеюсь, вы будете последним, кто получит эту ошибку из наших документов.