請在下列情況下幫助我找到正確的解決方案。如何在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