如何检查电子邮件地址是否已使用Firebase

Eth*_*han 2 completionhandler swift firebase-authentication

处理某些FirAuth事情,但由于某种原因,我无法弄清楚如何检查用户是否已经提出了电子邮件地址.我曾尝试过.fetchProvidersForEmail一段时间之前在其他问题中提出的建议,但无论出于何种原因,它都无法正常工作.此外,对于完成处理程序,我是非常环保的,所以任何建设性的批评都会受到欢迎.所以,就目前而言,我的代码中与此相关的部分是:

import UIKit
import Firebase
class LoginViewController: UIViewController {
var reply : Bool = true
@IBOutlet weak var emailTxt: UITextField!

@IBAction func nextScreen(sender: UIButton) {
print(emailCheck(emailTxt.text!))
}

 func emailCheck(input : String)->Bool{
    let pullEmails = FIRAuth.auth()!.fetchProvidersForEmail(input, completion:{
        result,error in
        var decision : Bool = true
        if error == "nil" {
            print(error)
            self.reply = true
        }else{
            print(error)
            self.reply = false
        }
    })
    return reply
}
}
Run Code Online (Sandbox Code Playgroud)

所以这就是回复总是打印true,可能是因为我明确地将它定义在顶部.无论哪种方式,它几乎就像完成处理程序没有等待实际完成它之前returns的值.我试图弄清楚如何使用它们,AsyncTasks但是我想知道我在这里是否有一个简单的错误可以解决这个问题.谢谢大家!

CWi*_*ley 8

我试过了.fetchProviders(forEmail: String, completion: FIRProviderQueryCallback?),如果在Firebase中提供了有效的电子邮件地址,它将在一个[String]?.中返回其密码.如果有密码,您知道有一个活动帐户:

   FIRAuth.auth()?.fetchProviders(forEmail: email, completion: { (stringArray, error) in
            if error != nil {
                print(error!)
            } else {
                if stringArray == nil {
                    print("No password. No active account")
                } else {
                    print("There is an active account")
                }
            }
        })
Run Code Online (Sandbox Code Playgroud)

这不是一个黑客,但我没有找到更好的东西.披露:我只使用密码验证

如果您正在创建用户或登录,则会.emailAlreadyInUse从回调中收到错误消息.以下是引发的所有可能错误的列表Auth.


Eth*_*han 6

这个答案花了我很长时间才找到,但现在就是这样.

func emailCheck(input: String, callback: (isValid: Bool) -> Void) {
    FIRAuth.auth()?.signInWithEmail(input, password: " ") { (user, error) in
        var canRegister = false

        if error != nil {
            if (error?.code == 17009) {
                canRegister = false
            } else if(error?.code == 17011) {
                //email doesn't exist
                canRegister = true
            }
        }

        callback(isValid: canRegister)
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码的工作原理非常简单.基本上,如果您将非空密码传递给Firebase,即" "代替""您将获得某种错误代码.我正在寻找的两个最重要的返回代码是17009和17011.这是因为如果17009返回(表示错误的密码),那么我们知道已经存在与该提议的地址相关联的电子邮件地址,因此用户不应该能够注册新的地址.下一个代码17011非常简单.这意味着没有用户存档该给定的电子邮件地址,其中10个允许用户声明它.我用这个来调用这个函数:

mailCheck(emailTxt.text!) { isValid in
                if isValid {
                    print("valid")
                } else {
                    print("Invalid!")
                }
Run Code Online (Sandbox Code Playgroud)

然后管理boolean它来自它.希望这能帮助其他人处于同样的境地!

  • 感谢您发布此内容!这很难看,但需要有办法完成这个/某种方式/.我感谢你的分享! (2认同)