Как заставить firebase проверять учетные данные на странице входа - PullRequest
1 голос
/ 25 мая 2020

поэтому я создаю приложение, и пользователю нужно создать учетную запись, поэтому я подключаю свое приложение к Firebase, все работает нормально на странице регистрации, но на странице входа я могу написать все, что захочу, и он отправится домой страница (цель кнопки входа), но это не должно вызывать ее работу, даже когда я пишу недопустимые учетные данные в текстовое поле Я могу кому-нибудь помочь, я знаю, что, вероятно, сделал ошибку, но это код, который я использую

import UIKit
import FirebaseAuth
import Firebase

class loginViewController: UIViewController {



    @IBOutlet weak var Email: UITextField!
    @IBOutlet weak var Password: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }


    @IBAction func SignInButton(_ sender: Any) {
    validateFields()
    }

    @IBAction func CreateOneButton(_ sender: Any) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(identifier: "SignUpPage")
        vc.modalPresentationStyle = .overFullScreen
        present(vc, animated: true)
    }
    func validateFields() {
        if Email.text?.isEmpty == true {
            print("No email text")
            return
        }
        if Password.text?.isEmpty == true {
            print("No password")
            return
        }
    login()
    }
    func login() {
        Auth.auth().signIn(withEmail: Email.text!, password: Password.text!) { [weak self] authResult, err in
            guard self != nil else {return}
            if let err = err {
                print(err.localizedDescription)
            }
            self!.checkUserInfo()
        }
    }
    func checkUserInfo() {
        if Auth.auth().currentUser != nil {
            print(Auth.auth().currentUser?.uid as Any)
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let vc = storyboard.instantiateViewController(identifier: "Home")
            vc.modalPresentationStyle = .overFullScreen
            present(vc, animated: true)
        }
    }
}

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Попробуйте это

func login() {
        Auth.auth().signIn(withEmail: Email.text!, password: Password.text!) { (results, error) in
            if error != nil {
               // sign in error (maybe display to the user)
            } else {
              // go to homescreen here
              self.goToHomeScreen()
            }
        }
    }

func goToHomeScreen() {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let vc = storyboard.instantiateViewController(identifier: "Home")
            vc.modalPresentationStyle = .overFullScreen
            present(vc, animated: true)
}

Я считаю, что он не работал с вашим кодом, потому что вы проверяете, вошел ли пользователь в систему до завершения метода .signIn (), что означает, что он всегда будет возвращать nil. Используя способ, который я предоставил, вы сначала проверяете, есть ли ошибка входа (были введены неправильные учетные данные), а если нет, он перенаправит вас на домашнюю страницу, и вы войдете в систему.

Также имейте в виду, что импорт Firebase вверху вместе с FirebaseAuth является избыточным. Импорт Firebase охватывает все службы Firebase. Это означает, что если вы просто используете службу аутентификации в этом файле, вы можете удалить импорт Firebase и просто оставить импорт для FirebaseAuth.

0 голосов
/ 26 мая 2020

Вот в чем проблема. Firebase возвращает ошибку в функции входа в систему, но вы не обрабатываете ошибку, и код падает до self!.checkUserInfo()

func login() {
    Auth.auth().signIn(withEmail: Email.text!, password: Password.text!) { [weak self] authResult, err in
        guard self != nil else {return}
        if let err = err {
            print(err.localizedDescription) <- This prints an error
        }
        //code falls through to this next line because the error wasn't handled
        self!.checkUserInfo()
    }
}

После аутентификации пользователя аутентификация «застревает» до тех пор, пока он не выйдет из системы. code

func checkUserInfo() {
        if Auth.auth().currentUser != nil {

проверяет, что currentUser не равен нулю.

Вы можете исправить это, сделав это

if let err = err {
   print(err.localizedDescription) <- This prints an error
   //handle the error here; present a message to the user or
   //  possibly log the prior user out
   return
}
...