【发布时间】:2016-12-29 07:39:51
【问题描述】:
请帮助我在以下情况下找到正确的解决方案。
我正在使用 swift 开发 ios 应用程序,它将使用 Firebase 作为后端。
用户应该能够使用电子邮件/密码或/和 facebook 登录 Firebase。也许以后会添加google。
对我来说,为每个真实用户拥有一个 firebase 帐户很重要,因为用户将获得奖励积分,如果在一个设备上(通过电子邮件登录)他将获得 X 积分并且在其他设备上(通过facebook)他会有不同的观点。
这是我用来通过电子邮件登录的代码:
//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 描述了如何链接身份验证提供者的方式,但用户应该使用一种方法登录,然后才能链接帐户。
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)
不确定这是否是一个好的选择?
感谢您的回复。
【问题讨论】:
标签: ios swift firebase swift3 firebase-authentication