Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Firebase身份验证将Facebook链接到谷歌_Ios_Swift_Firebase_Firebase Authentication - Fatal编程技术网

Ios Firebase身份验证将Facebook链接到谷歌

Ios Firebase身份验证将Facebook链接到谷歌,ios,swift,firebase,firebase-authentication,Ios,Swift,Firebase,Firebase Authentication,经过多次测试后,我决定创建一个新的xCode项目,以便更好地理解Firebase与多个提供者的身份验证 我在Firebase->登录方法->每个电子邮件地址设置一个帐户 每个电子邮件地址的帐户 防止用户创建多个 使用具有不同身份验证的相同电子邮件地址的帐户 提供者 在这一点上,我已经按照Firebase指南,使用Facebook和Google实现了登录。。一切似乎都很完美,但我总是发现自己犯了同样的错误,我无法控制: 当我的用户通过Google创建Firebase帐户时,如果他决定使用Faceb

经过多次测试后,我决定创建一个新的xCode项目,以便更好地理解Firebase与多个提供者的身份验证

我在Firebase->登录方法->每个电子邮件地址设置一个帐户

每个电子邮件地址的帐户

防止用户创建多个 使用具有不同身份验证的相同电子邮件地址的帐户 提供者

在这一点上,我已经按照Firebase指南,使用FacebookGoogle实现了登录。。一切似乎都很完美,但我总是发现自己犯了同样的错误,我无法控制:

当我的用户通过Google创建Firebase帐户时,如果他决定使用Facebook,他将无法再登录

Facebook使用Firebase完成身份验证流程时返回错误:

Facebook提供商出现Firebase错误:已存在具有相同电子邮件地址但不同登录凭据的帐户。使用与此电子邮件地址关联的提供商登录

继续一步一步地遵循文档,我停止了(firebase解释了如何处理此错误)

我还实现了错误处理,但在调用
Auth.Auth().fetchSignInMethods
Firebase后,Firebase说我应该使用现有的提供程序对用户进行身份验证,此时我如何获取用于使用现有提供程序进行身份验证的凭据


  • 我不想重新打开现有的提供程序控制器以获取新凭据

  • 我是否有义务要求用户登录现有提供商并再次显示另一个访问控制器(在本例中为谷歌

  • 我该如何处理这种情况



此代码不遵循指南-它特别显示在获得凭据后不要调用
Auth.Auth().sign
。您需要在凭证步骤停止,然后链接帐户。同样,在获得凭据后不要调用'Auth.Auth().sign(with:credential)@Jay您能编辑我的代码示例吗?至少你更了解。。。如果我没有插入带有凭据的登录,我如何将facebook链接到谷歌?当facebook报告错误时,我没有当前用户链接凭据。。。这是我的问题,这就是为什么我要求您提供一个代码示例以便更好地理解
 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
                             }
                         }
                     }
                 }
             }
         }
     }
 }