我在使用Firebase及其电子邮件验证流程时遇到问题。我能够创建一个新用户,并提供带有链接的电子邮件,以验证是否正确发送了电子邮件地址。现在,仅出于测试目的,我没有单击链接来验证电子邮件,但是,如果我打开该应用程序,则可以访问并执行任何操作。我不确定我缺少什么或做错了什么。在过去的几天里,我一直坚持这一点。任何帮助是极大的赞赏。
我的代码
@IBAction func loginBtnTapped(_ sender: Any) {
SVProgressHUD.show()
guard let email = emailTxt.text,
let password = passwordTxt.text else { return }
Auth.auth().signIn(withEmail: email, password: password) {
(user, error) in
if error != nil {
let alert = UIAlertController(title: "Login Error",
message:"Incorrect Email and/or Password", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style:
.default) { _ in })
self.present(alert, animated: true){}
if let error = error {
print("error: \(error.localizedDescription)")
}
if Auth.auth().currentUser?.isEmailVerified == false {
let alert = UIAlertController(title: "Unable to
login", message:"Pending: email verification", preferredStyle:
.alert)
alert.addAction(UIAlertAction(title: "OK", style:
.default) { _ in })
self.present(alert, animated: true){}
print("")
SVProgressHUD.dismiss()
}
}
self.dismiss(animated: true, completion: nil)
SVProgressHUD.dismiss()
}
}
预期结果
除非电子邮件经过验证,否则新创建的用户应该无法登录和打开应用程序。
答案 0 :(得分:0)
在验证电子邮件地址之前,应禁用用户帐户。这似乎是安全禁止登录的唯一方法。
通常,您可以使用sendSignInLinkToEmail()发送带有特定URL的电子邮件地址验证消息。电子邮件验证过程完成后,用户将自动重定向到该URL。
在这种情况下,我们邀请用户创建密码,然后激活其帐户,然后再将其重定向到登录屏幕。
答案 1 :(得分:0)
Firebase身份验证与身份验证用户有关。如果您输入(说)正确的电子邮件地址和密码,我们相信您就是您。
如果您只想允许已验证电子邮件地址的用户访问数据,则可以(并且称为授权)。不过,您将在试图保护的后端中进行检查,例如在Firestore数据库的安全规则中,如此处(Firebase) Firestore security rules - allow if email verified without custom tokens?
所示另请参见
答案 2 :(得分:0)
您需要检查Firebase数据库中是否显示“已通过电子邮件验证”的字段,然后如果该BOOL值为TRUE,则将其放入应用程序中。当他们单击电子邮件中的链接后,布尔值将自动变为TRUE。因此,与其像您那样做,不如查询该用户的用户表,并检查布尔值是否已通过验证,如果没有通过验证,则不要让他们进入。祝您好运,祝您有美好的一天< / p>
答案 3 :(得分:0)
我能够按预期工作。用户需要验证电子邮件,否则,他们将无法访问该应用程序。我不必在Firebase中修改规则。 希望这对任何人都有帮助。
loginVC
private var authUser : User? {
return Auth.auth().currentUser
}
public func verifyEmail() {
authUser?.reload(completion: { (err) in
if err == nil {
if self.authUser!.isEmailVerified == true {
self.dismiss(animated: true, completion: nil)
} else {
let alert = UIAlertController(title: "Confirm your email
address.", message: "A confirmation email has been sent to" + " " +
((self.emailTxt.text)!) + " . " + "Click on the confirmation link to activate
your account. ", preferredStyle: .alert)
let actionTaken = UIAlertAction(title: "OK", style:
.default, handler: nil)
alert.addAction(actionTaken)
self.present(alert, animated: true, completion: nil)
}
}
})
}
@IBAction func loginBtnTapped(_ sender: Any) {
SVProgressHUD.show()
guard let email = emailTxt.text,
let password = passwordTxt.text else { return }
Auth.auth().signIn(withEmail: email, password: password) { (user,
error) in
self.verifyEmail()
if error != nil {
let alert = UIAlertController(title: "Login Error",
message:"Error: \(error!.localizedDescription)", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default) { _
in })
self.present(alert, animated: true){}
if let error = error {
print("error: \(error.localizedDescription)")
}
}
SVProgressHUD.dismiss()
}
}