在firebase上链接多个auth提供程序

时间:2017-09-28 02:21:28

标签: ios swift firebase authentication firebase-authentication

目前,我允许用户“使用Facebook登录”:

@objc func handleFBLogin() {
    FBSDKLoginManager().logIn(withReadPermissions: ["email", "public_profile"], from: self) { (result, error) in
        if error != nil {
            print(error as Any)
            return
        }

        self.handleFBAccessToken()
    }
}

func handleFBAccessToken() {
    let accessToken = FBSDKAccessToken.current()
    guard let accessTokenString = accessToken?.tokenString else { return }
    let credentials = FacebookAuthProvider.credential(withAccessToken: accessTokenString)

    Auth.auth().signIn(with: credentials) { (user, error) in
        if error != nil {

        // I assume I handle the errors here

            print(error as Any)
            return
    }

        // successfully logged in user
        self.instantiateTabVC()
    }

    FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, email"]).start { (connection, result, error) in

        if error != nil {
            print(error as Any)
        }
    }
}

我想添加它,以便如果他们已经通过电子邮件/密码创建了帐户,这两个帐户将自动链接/合并(反之亦然)。在“我假设我在这里处理错误”中,我添加了

let providers = Auth.auth().fetchProviders(forEmail: AuthErrorUserInfoEmailKey)   
// sign in with existing account 
// call linkWithCredential:completion:

获取已存在的电子邮件。我的基础是thisthis(两个类似的问题)。我明白前提是

  

fetchProvidersForEmail与该电子邮件一起使用,该电子邮件将查找与该电子邮件关联的提供商ID。然后,您可以使用其中一个提供程序登录用户。使用现有帐户完成登录后,可以使用导致错误发生的原始凭据调用linkWithCredential:completion:

然而,我是Swift的新手并且对于如何解决这个问题非常困惑。任何示例代码都非常有用。我也试过阅读文档,但这也没有帮助(因为我可能还没有学会正确理解文档)

我希望我正朝着正确的方向努力解决这个问题,但是,如果你有任何其他建议,我会对此持开放态度。我感谢任何帮助

1 个答案:

答案 0 :(得分:0)

尝试此方法,如果存在,则不会创建新用户。

func facebook() {
    let loginManager: FBSDKLoginManager = FBSDKLoginManager()
    loginManager.logIn(withReadPermissions: ["email"], from: self, handler: { result, error in
        if let error = error {
            self.showMessagePrompt(error.localizedDescription)
        } else if result!.isCancelled {
            print("FBLogin cancelled")
        } else {
            // [START headless_facebook_auth]
            let credential = FacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString)
            // [END headless_facebook_auth]
            self.firebaseLogin(credential)
        }
    })
}

func firebaseLogin(_ credential: AuthCredential) {

    if let user = Auth.auth().currentUser {
        // [START link_credential]
        user.link(with: credential) { _, error in
            // [START_EXCLUDE]
            if let error = error {
                self.showMessagePrompt(error.localizedDescription)
                return
            }
            // [END_EXCLUDE]
        }
        // [END link_credential]
    } else {
        // [START signin_credential]
        Auth.auth().signIn(with: credential) { _, error in
            // [START_EXCLUDE silent]
            self.hideSpinner {
                // [END_EXCLUDE]
                if let error = error {
                    // [START_EXCLUDE]
                    self.showMessagePrompt(error.localizedDescription)
                    // [END_EXCLUDE]
                    return
                }
                // User is signed in
                // [START_EXCLUDE]
                // Merge prevUser and currentUser accounts and data
                // ...
                // [END_EXCLUDE]
            }
        }
        // [END signin_credential]
    }

}
相关问题