Я нашел решение!Это было не слишком сложно реализовать, но это кажется хакерским.
Итак, мы знаем, что при использовании signInAndRetrieveDataWithCredential(cred)
для входа в Facebook учетная запись создается , даже если она еще не существует. Чтобы решить эту проблему, нам нужно убедиться, что мы обрабатываем следующие три вещи:
- Определить, является ли учетная запись новой
- Удалить текущую учетную запись, созданную firebase
- Выдает ошибку, чтобы выйти из текущего потока и вернуться туда, где вы были раньше.
Я только что внедрил и протестировал это решение, и, похоже, оно прекрасно работает:
// ... do your stuff to do fb login, get credential, etc:
const userInfo = await firebase.auth().signInAndRetrieveDataWithCredential(credential)
// userInfo includes a property to check if the account is new:
const isNewUser = _.get(userInfo, 'additionalUserInfo.isNewUser', true)
// FIRST, delete the account we just made.
// SECOND, throw an error (or otherwise escape the current context.
if (isNewUser) {
firebase.auth().currentUser.delete()
throw new Error('Couldn\'t find an existing account.')
}
// If the user already exists, just handle normal login
return userInfo.user
Причина, по которой я это сделал, состояла в том, чтобы убедиться, что пользователи должны были пройти через «создать учетную запись» в моем приложении.Ваш случай также будет очень легко реализовать, например:
let credential = firebase.auth.FacebookAuthProvider.credential(event.authResponse.accessToken)
firebase.auth().signInAndRetrieveDataWithCredential(credential)
.then(userCredential => {
const isNewUser = userCredential.additionalUserInfo.isNewUser
if (isNewUser) {
firebase.auth().currentUser.delete()
// The following error will be handled in your catch statement
throw new Error("Couldn't find an existing account.")
}
// Otherwise, handle login normally:
const user = userCredential.user
app.debug("DEBUG: Existing user signed in:"+user.uid)
this.loginSuccess(user)
}).catch( (err) => {
app.error("ERROR re-signing in:"+err.code)
$("#login_status_msg").text(err)
})