Firebase电子邮件验证无法正常工作,无需验证用户便可以登录

时间:2019-10-23 03:42:23

标签: swift firebase firebase-authentication email-validation

我在使用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()
        }
    }

预期结果

除非电子邮件经过验证,否则新创建的用户应该无法登录和打开应用程序。

4 个答案:

答案 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()
        }

    }