Я столкнулся со странной проблемой, когда осуществлял вход в Google Expo и Facebook с аутентификацией Firebase.Примечания:
- Я могу создать новые учетные записи, выполнив вход с помощью Google и Facebook
- Используя адрес электронной почты, который является общим для Google и Facebook, если я сначала создал свою учетную записьподписавшись через Facebook, а затем войдя в систему после выхода из системы, я смогу получить доступ к той же учетной записи
- Но, с другой стороны, если я зарегистрируюсь в 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.');
}
});
};
ПредоставленоПожарная документация (в основном)