Lan*_*ria 5 ios firebase swift firebase-authentication firebase-realtime-database
使用电子邮件登录新用户或创建新用户时有 2 种不同的方法签名。创建新用户时,如果电子邮件已存在,将返回错误;如果电子邮件不存在,则登录用户将返回错误:
// create account
Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (authDataResult, error)
if let error = error {
// if this email address already exists an error will be returned
return
}
})
// login
Auth.auth().signIn(withEmail: emailTextField.text!, password: self.passwordTextField.text!, completion: { (authDataResult, error) in
if let error = error {
// if this email address isn't inside the system then an error will be returned
return
}
})
Run Code Online (Sandbox Code Playgroud)
但是,当使用用户的电话号码登录或创建新帐户时,我必须在这两种情况下使用相同的方法签名。
func loginExistingUserOrCreateNewOne(phoneNumber: String, verificationCode: String) {
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { (verificationID, error) in
if let error = error { return }
guard let verificationId = verificationID else { return }
let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationId, verificationCode: verificationCode)
Auth.auth().signIn(with: credential, completion: { (authDataResult, error) in
guard let authUser = authDataResult else { return }
let checkUsersRef = Database.database().reference().child("users").child(authUser.user.uid)
checkExistingUsersRef.observeSingleEvent(of: .value, with: { (snapshot) in
if !snapshot.exists() {
// this is a new user, now add them to the users ref
let newUserDict = ["signupDate": Date().timeIntervalSince1970]
checkUsersRef.updateChildValues(newUserDict, withCompletionBlock: { (error, ref) in
if let error = error {
// because there is an error this ref was never updated so now I have to sign this user out and they have to start over agin
do {
try Auth.auth().signOut()
} catch let err as NSError {
// alert user there is a major problem
}
return
}
// if no error let them go to HomeVC
})
return
}
// this is a previous user fetch dict data and let them proceed to HomeVC
guard let previousUserDict = snapshot.value as? [String: Any] else { return }
// get newUserDict values and let them go to HomeVC
})
})
}
}
Run Code Online (Sandbox Code Playgroud)
如果用户已经拥有帐户,我需要从用户引用中获取一些数据,然后让他们继续访问 HomeVC。如果用户以前从未注册过,那么我必须将它们添加到用户引用中,然后让他们继续。这是一个 2 步过程。
问题是这些额外的步骤似乎没有必要。例如,使用电子邮件签名或登录会返回错误,因此无需创建并检查另一个引用以查看该电子邮件是否已存在。
除了使用上面代码中的流程之外,还有其他方法可以确定在创建新帐户之前电话号码是否存在或者登录时电话号码是否不存在吗?
您将需要使用 admin sdk通过电话号码查找用户:
admin.auth().getUserByPhoneNumber(phoneNumber)
.then(function(userRecord) {
// User exists.
})
.catch(function(error) {
if (error.code === 'auth/user-not-found') {
// User not found.
}
});
Run Code Online (Sandbox Code Playgroud)
您可以使用 Cloud Function 托管 HTTP 端点。通过电话号码查找用户只能通过运行服务器端的经过身份验证的 API(使用 Firebase Admin SDK)。