请在下列情况下帮助我找到正确的解决方案。如何在Firebase中管理用户的不同身份验证
我正在用swift开发ios应用程序,它将使用Firebase作为后端。
用户应该能够通过电子邮件/密码或/和脸书登录到firebase。也许谷歌将在稍后添加。
对于每个真实用户拥有一个Firebase帐户非常重要,因为用户将获得奖励积分,并且如果在一个设计中(使用电子邮件登录),他将拥有X个积分并且在其他设备上与脸谱)他会有不同的观点。
这里是代码,我使用的电子邮件登录:
//EMAIL REGISTER
@IBAction func registerAction(_ sender: Any) {
if self.emailTextField.text == "" || self.passwordTextField.text == "" {
Print("Please enter email and password.")
} else {
FIRAuth.auth()?.createUser(withEmail: self.emailTextField.text!, password: self.passwordTextField.text!, completion: { (user, error) in
if error == nil {
self.logoutButton.isHidden = false
self.usernameLabel.text = user!.email
self.emailTextField.text = ""
self.passwordTextField.text = ""
} else {
Print("\((error?.localizedDescription)!)")
}
})
}
}
//EMAIL LOGIN
@IBAction func loginAction(_ sender: Any) {
if self.emailTextField.text == "" || self.passwordTextField.text == "" {
print("Please enter email and password.")
} else {
FIRAuth.auth()?.signIn(withEmail: self.emailTextField.text!, password: self.passwordTextField.text!, completion: { (user, error) in
if error == nil {
self.logoutButton.isHidden = false
self.usernameLabel.text = user!.email
self.emailTextField.text = ""
self.passwordTextField.text = ""
} else {
Print("\((error?.localizedDescription)!)")
}
})
}
}
这里是我使用与Facebook登录代码:
func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
self.fbLoginButton.isHidden = true
if error != nil {
self.fbLoginButton.isHidden = false
print(error.localizedDescription)
return
} else if (result.isCancelled) {
print("canceled")
self.fbLoginButton.isHidden = false
} else {
let credential = FIRFacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString)
FIRAuth.auth()?.signIn(with: credential) { (user, error) in
if let error = error {
print(error.localizedDescription)
return
}
}
}
}
这两种方法都做工精细,但他们创造两个独立的账户。
和我结束了以下结果:
很明显,我想这两个帐户自动合并。
Documentation描述了如何链接auth提供程序的方式,但用户应该使用一种方法登录并且只有在该方法之后才能链接帐户。 linkWithCredential
方法用于已经拥有oauth凭证的情况。如果用户使用电子邮件在一台设备上创建,如果他决定再次在其他设备上使用Facebook登录,则无法工作。
与任一方式的FIRAuth.auth()?.addStateDidChangeListener
服务是表示我使用数据库第二视图控制器洛在后。
覆盖FUNC viewDidLoad中(){ super.viewDidLoad()
let user = FIRAuth.auth()?.currentUser
let dat = user?.providerData
let email = user?.providerData[0].email
let name = user?.displayName
if email != nil {
self.ref.child("user_profile").child("\(user!.uid)/email").setValue(email)
}
if name != {
self.ref.child("user_profile").child("\(user!.uid)/name").setValue(name)
}
}
让我们说,我们洛与Facebook,也许就可以找到用户的UID具有相同的电子邮件和运行更新?万一有很多用户,这不是一个好主意。
其他想法是使用电子邮件作为ID这样的:
self.ref.child("user_profile").child("\(email)/name").setValue(name)
不知道这是一个很好的选择吗?
感谢您的回复。
嗨,如果我选择防止多ACCS的创作......我用电子邮件和密码创建的帐户后,我不能用Facebook登录。 (因为电子邮件是相同的)。我使用的是与您通过电子邮件和密码登录相同的代码。或者我错过了什么? – Almazini
可以说我已经有一个电子邮件和密码帐户。我想在其他设备上使用Facebook登录。我想登录到现有用户而不是创建新用户。 – Almazini
生病编辑我的答案... – Jad