繁体   English   中英

Firebase 电子邮件验证 Swift

[英]Firebase Email Verification Swift

我尝试使用 Firebase 身份验证,但即使我没有使用电子邮件确认验证,登录也让我进入。 我有两个 Viewcontroller ,一个用于登录,另一个用于注册。 我可以登录并收到用于验证的电子邮件,但我也可以在不验证的情况下登录。

public func sendVerificationMail() {
  if self.authUser != nil && !self.authUser!.isEmailVerified {
    self.authUser!.sendEmailVerification(completion: { (error) in
      // Notify the user that the mail has sent or couldn't because of an error.
    })
  } else {
    // Either the user is not available, or the user is already verified.
  }
}

@IBAction func signupButtonTapped(_ sender: Any) {
  print("Sign up button tapped")
  Auth.auth().createUser(withEmail: self.userEmailTextField.text!, password: self.userPasswordTextField.text!) { (user, error) in
    if user != nil {
      print("User has Signed Up")
      self.sendVerificationMail()    
    }
    if error != nil {
      print("User cant Sign Up")
    }
  }
}

@IBAction func signinButtonTapped(_ sender: Any) {
  Auth.auth().signIn(withEmail: self.userEmailTextField.text!, password: self.userPasswordTextField.text!) { (user, error) in
    if user != nil {
      print("User has Signed In") 
    }
    if error != nil {
      print("Cant Sign in user")
    } else {
      self.performSegue(withIdentifier: "toHome", sender: nil)
    }
  }
}

Firebase 身份验证不会阻止用户在未验证电子邮件时登录。 如果您想阻止用户在未经验证的情况下继续前进,则需要使用isEmailVerified布尔值在客户端上对此进行编码。

Auth.auth().signIn(withEmail: self.userEmailTextField.text!, password: self.userPasswordTextField.text!) { (authResult, error) in
  if let authResult = authResult {
    let user = authResult.user
    print("User has Signed In")
    if user.isEmailVerified {
      self.performSegue(withIdentifier: "toHome", sender: nil)
    } else {
      // do whatever you want to do when user isn't verified
    }
  }
  if let error = error {
    print("Cant Sign in user")
  }
}

比@jen-person 提供的更全面的解决方案(并基于另一个 SO 答案)是这样的:

final class MySignInView: UIView { // or possibly MySignInViewController: UIViewController

    // ... your properties etc...

    @IBAction func signInButtonPressed(sender _: AnyObject) {
        trySigningIn()
    }

}

// MARK: Private
private extension MySignInView {

    func trySigningIn() {
        guard 
            let email = userEmailTextField.text,
            let password = userPasswordTextField.text
        else {
            print("Cannot sign in, email or password is 'nil'")
            return
        }

        do {
            try signIn(email: email, password: password) { [unowned self] authResult in
                self.userDidSignIn(authResult.user)
            }
        } catch {
            // Display error
        }
    }

    func userDidSignIn(_ user: FIRUser) {
        // Creds to Jen: https://stackoverflow.com/a/51389154/1311272
        guard user.isEmailVerified else {
            // TODO display message about non verified email user?
            return
        }
        performSegue(withIdentifier: "toHome", sender: nil)
    }
}

// MARK: Error
private extension MySignInView {
    enum Error: Strng, Equatable {
        case invalidEmail
        case userDisabled
        case wrongPassword
        case userNotFound
        case networkError
        case unknownError
    }
}

// MARK: Firebae specific
private extension MySignInView {

    func signIn(
        email: String, 
        password: String, 
        onSuccessful: (AuthDataResult) -> Void
    ) throws {

        Auth.auth().signIn(
            withEmail: email, 
            password: password
        ) { (authResult, anyError) in
            if let anyError = anyError {
                if let error = Error(anyError: anyError) {
                    throw error
                } else {
                    fatalError("Unsupported error: \(anyError)")
                }
            }
            onSuccessful(authResult)
        }
    }
}

private extension MySignInView.Error {

    init?(anyError: Swift.Error) {
        guard let authErrorCode = FIRAuthErrorCode(rawValue: anyError.code) else {
            return nil
        }
        self.init(fireBaseAuthErrorCode: authErrorCode)
    }

    // Creds goes to to: https://stackoverflow.com/a/39936083/1311272
    init(fireBaseAuthErrorCode: FIRAuthErrorCode) {
        switch errCode {
        case .ErrorCodeInvalidEmail:
            self = .invalidEmail
        case .ErrorCodeUserDisabled:
            self = .userDisabled
        case .ErrorCodeWrongPassword:
            self = .wrongPassword
        case .ErrorCodeUserNotFound:
            self = .userNotFound
        case .ErrorCodeNetworkError:
            self = .networkError
        default:
            self = .unknownError
        }
    }
}

当然,您需要适当地通知用户不同的错误/不正确的状态,而不仅仅是打印。

这段代码可能我应该移到ViewModel ,如果您没有使用MVVM ,我强烈推荐它:)。

if let email = emailTextfield.text, let password = passwordTextfield.text {
Auth.auth().signIn(withEmail: email, password: password) { authResult, error in
    
    if let e = error{
        print(e.localizedDescription)
    }
    else {
        //Do whatever you want to do after successful login
        
    }
    }
}

你也可以试试这个:

   if( !Auth.auth().currentUser!.isEmailVerified) {
    // do something
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM