【发布时间】:2023-03-15 06:22:01
【问题描述】:
当已存在具有相同电子邮件地址的帐户时,我在尝试使用 FB 登录凭据登录 Firebase 身份验证帐户时遇到了困难。最终,我想将这两个身份验证提供程序链接到同一个 Firebase 用户帐户,但目前我无法获取 FB 凭据以登录 Firebase,如果已经存在的话,使用我认为完全遵循 Firebase 文档的下面的代码。我已经根据身份验证提供者限制了单个用户(电子邮件)拥有多个帐户的能力。当我删除“原始”Firebase 用户帐户时,Facebook 登录能够按预期登录并创建用户帐户,因此问题似乎仅在已有来自不同身份验证提供商的具有相同电子邮件地址的 Firebase 身份验证帐户时才会出现
场景
在我正在测试的场景中,我已经创建了一个电子邮件/密码帐户(原始)并尝试通过 FB 登录(使用与电子邮件/密码帐户相同的电子邮件地址)将我的 FB 帐户添加到该帐户原始帐户。我能够获得 FB AccessToken 和 FB 凭据,但是当我将其传递给 Auth.auth().sign(with: credential ..... 它总是出错并出现以下错误:
错误
Error Domain=FIRAuthErrorDomain Code=17012 “已存在具有相同电子邮件地址但登录凭据不同的帐户。请使用与此电子邮件地址关联的提供商登录。” UserInfo={FIRAuthErrorUserInfoNameKey=ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL, FIRAuthErrorUserInfoEmailKey=akash11x@gmail.com, FIRAuthErrorUserInfoUpdatedCredentialKey=, NSLocalizedDescription=一个帐户已经存在,具有相同的电子邮件地址但不同的登录凭据。使用与此电子邮件地址关联的提供商登录。
代码
@IBAction func fbLoginButton(_ sender: FBButton) {
let loginManager = LoginManager()
loginManager.logIn(permissions: ["public_profile", "email"], from: self) { (result, error) in
if error != nil {
return
}
print(result)
guard let accessToken = AccessToken.current else {
print("Failed to get access token")
return
}
print(accessToken)
let credential = FacebookAuthProvider.credential(withAccessToken: accessToken.tokenString)
print(credential)
Auth.auth().signIn(with: credential, completion: { (firebaseUser, error) in //Can't get passed this point when another account with the same email address already exists
if error != nil {
print("Could not login into Firebase using FB credentials")
return
}
print("This is the FirebaseUser after FB Login: \(firebaseUser)")
firebaseUser?.user.link(with: credential, completion: { (authResult, error) in
if error != nil {
print("Firebase Auth Providers not linked")
return
}
// let prevUser = Auth.auth().currentUser
// Auth.auth().signIn(with: credential) { (authResult, error) in
// if let error = error {
// // ...
// return
// }
// // User is signed in
// // ...
// }
// // Merge prevUser and currentUser accounts and data
//
// ...
//This user has a profile, go to tab controller
let tabBarVC = self.storyboard?.instantiateViewController(withIdentifier: Constants.Storyboard.tabBarController)
self.view.window?.rootViewController = tabBarVC
self.view.window?.makeKeyAndVisible()
})
})
}
}
【问题讨论】:
-
用户需要使用主凭据(帐户已经存在的一个)登录,然后从辅助凭据获取链接。他们无法使用辅助帐户登录,因为主帐户已经存在。
-
你能更详细地解释一下它的流程吗?我的欢迎屏幕允许您登录 FB 或注册帐户或使用电子邮件登录。如果他们使用电子邮件(这是原始电子邮件)登录,则返回该 FB 登录屏幕的唯一方法是注销,这将删除使用电子邮件登录的身份验证。这似乎是我见过的大多数登录的典型 UX。您是在建议不同的流程吗?
标签: swift facebook firebase google-cloud-platform firebase-authentication