Как проверить, используется ли уже адрес электронной почты Firebase

работаю над некоторыми 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
}
}

Итак, что происходит с этим, так это то, что ответ всегда печатает true, вероятно, потому, что я явно определил его вверху. В любом случае, это почти так, как если бы обработчик завершения не ждал фактического завершения, прежде чем он returns значение. Я пытался понять, как их использовать, а также AsyncTasks, но мне было интересно, есть ли простая ошибка, которую я сделал здесь, которая могла бы решить эту проблему. Спасибо всем!


person Ethan    schedule 30.07.2016    source источник


Ответы (2)


Я попробовал .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")
                }
            }
        })

Это немного меньше взлома, но я не нашел ничего лучше. Раскрытие информации: я использую только аутентификацию по паролю

Если вы создаете пользователя или входите в систему, вы получите ошибку .emailAlreadyInUse при обратном вызове. Вот список всех возможных ошибок. от Auth.

person CWiley    schedule 28.02.2017

Этот ответ занял у меня довольно много времени, чтобы найти, но вот он.

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)
    }
}

Причина, по которой этот код работает, довольно проста. По сути, если вы передадите ненулевой пароль в Firebase, то есть " " вместо "", вы получите какой-то код ошибки. Два наиболее важных кода возврата, которые я ищу, это 17009 и 17011. Это связано с тем, что если возвращается 17009 (означающий неправильный пароль), то мы знаем, что уже существует адрес электронной почты, связанный с этим предложенным адресом, поэтому пользователь не должен иметь возможность подписаться на новый. Следующий код, 17011, довольно прост. Это означает, что в файле нет пользователя с указанным адресом электронной почты, что позволяет пользователю требовать его. Я вызываю эту функцию, используя это:

mailCheck(emailTxt.text!) { isValid in
                if isValid {
                    print("valid")
                } else {
                    print("Invalid!")
                }

А затем управлять boolean, которые исходят от него. Надеюсь, это поможет другим людям в такой же ситуации!

person Ethan    schedule 31.07.2016
comment
Спасибо за публикацию! Это некрасиво, но должен быть способ добиться этого /каким-то образом/. Я ценю, что вы поделились! - person Brandon Konkle; 31.01.2017