我做了以下登录功能:
@objc func handleSignIn() {
guard let email = emailField.text else { return }
guard let pass = passwordField.text else { return }
Auth.auth().signIn(withEmail: email, password: pass) { user, error in
if error == nil && user != nil && (user!.user.isEmailVerified){
self.dismiss(animated: false, completion: nil)
}; if user != nil && !(user?.user.isEmailVerified)! {
self.lblStatus.text = "Please Verify Your Email"
}
else {
self.lblStatus.text = "Error logging in: \(error!.localizedDescription)"
resetForm()
}
}
尽管我尝试使用&& (user!.user.isEmailVerified)
规定来防止这种情况,但用户仍可以登录而无需验证电子邮件。我在这里想念什么?
答案 0 :(得分:0)
完成登录仅表示用户标识了自己,并且您知道哪个帐户代表了他们选择的身份。登录并不意味着可以授权对该帐户执行任何操作,除了更新其个人资料信息外。
您会注意到这里存在一些鸡肉和鸡蛋问题。登录必须成功完成才能获得User对象,并且该用户对象具有指示其电子邮件是否已通过验证的属性。因此,如果您想读取该属性,则必须允许登录。
从理论上讲,如果用户尚未验证,则可以立即将其注销,但是这样做可以防止他们要求再次发送电子邮件验证(如果他们删除了第一个或无法验证)。已交付。因此,现在您只有一个烦恼的用户,无法采取任何措施来解决问题。
如果要阻止用户在经过验证的其他Firebase产品中进行任何操作,则应使用安全规则来阻止不应允许的任何读写访问。您可以在规则中检查电子邮件验证标志。考虑使用auth.token.emailVerified
。 Example for Realtime Database here.