После многих испытаний я решил создать новый проект xCode, чтобы лучше понимать аутентификацию Firebase с несколькими провайдерами.
Я настроил в Firebase -> Методы входа -> Учетная запись на адрес электронной почты
Учетная запись на один адрес электронной почты
Запрещает пользователям создавать несколько учетных записей с использованием одного и того же адреса электронной почты с различными поставщиками аутентификации
На данный момент у меня есть реализовано, тщательно следуя руководству Firebase, войдите с помощью Facebook и Google .. Кажется, все работает отлично, но я всегда нахожу себя с той же ошибкой, с которой не могу справиться:
Когда мой пользователь создает учетную запись Firebase через Google , он больше не может войти в систему, если решит использовать Facebook .
Facebook возвращает ошибку, когда завершает процесс аутентификации с помощью Firebase:
Ошибка Firebase с провайдером Facebook: учетная запись уже существует с тем же адресом электронной почты, но с разными учетными данными. Войдите, используя провайдера, связанного с этим адресом электронной почты.
Продолжая шаг за шагом следовать документации, я остановился здесь (firebase объясняет, как обрабатывать эту ошибку)
Я также реализовал обработку ошибок, но после вызова Auth.auth().fetchSignInMethods
Firebase говорит, что я должен аутентифицировать пользователя с существующим провайдером, на этом этапе, как я могу получить учетные данные для аутентификации с существующим провайдером?
Я бы не хотел повторно открывать существующий контроллер провайдера для получения новых учетных данных
Я обязан попросить пользователя войти в систему с существующим провайдером и показать снова другой контроллер доступа (в данном случае это Google )?
- Как мне справиться с этой ситуацией?
override func viewDidLoad() {
super.viewDidLoad()
facebookSetup()
}
func facebookSetup() {
let loginButton = FBLoginButton(permissions: [ .publicProfile, .email ])
loginButton.center = view.center
loginButton.delegate = self
view.addSubview(loginButton)
}
//MARK: - FACEBOOK Delegate
func loginButton(_ loginButton: FBLoginButton, didCompleteWith result: LoginManagerLoginResult?, error: Error?) {
if let error = error {
print(error.localizedDescription)
return
}
let credential = FacebookAuthProvider.credential(withAccessToken: AccessToken.current!.tokenString)
Auth.auth().signIn(with: credential) { (authResult, error) in
if let error = error {
print("\n FIREBASE: ",error.localizedDescription)
// An account with the same email already exists.
if (error as NSError?)?.code == AuthErrorCode.accountExistsWithDifferentCredential.rawValue {
// Get pending credential and email of existing account.
let existingAcctEmail = (error as NSError).userInfo[AuthErrorUserInfoEmailKey] as! String
let pendingCred = (error as NSError).userInfo[AuthErrorUserInfoUpdatedCredentialKey] as! AuthCredential
// Lookup existing account identifier by the email.
Auth.auth().fetchSignInMethods(forEmail: existingAcctEmail) { providers, error in
if (providers?.contains(GoogleAuthProviderID))! {
// Sign in with existing account.
Auth.auth().signIn(with: "? ? ? ?") { user, error in
// Successfully signed in.
if user != nil {
// Link pending credential to account.
Auth.auth().currentUser?.link(with: pendingCred) { result, error in
// Link Facebook to Google Account
}
}
}
}
}
}
}
}