Аутентификация Firebase Ссылка Facebook на Google - PullRequest
2 голосов
/ 21 марта 2020

После многих испытаний я решил создать новый проект 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
                             }
                         }
                     }
                 }
             }
         }
     }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...