Регистрация все еще успешна, хотя имя пользователя занято - PullRequest
0 голосов
/ 19 января 2019

Я хочу создать систему, в которой пользователь не может зарегистрироваться, если имя пользователя уже занято другими. Однако это, похоже, не работает, так как даже если имя пользователя занято, процесс регистрации все еще завершен.

Я делаю это путем извлечения каждого имени пользователя из Firebase и запуска его через него, чтобы увидеть, используется ли уже введенное пользователем имя пользователя. Если это так, он должен остановить процесс регистрации и сказать пользователю ввести другое имя пользователя.

Код:

let ref = Database.database().reference(fromURL: "https://heytest.firebaseio.com/")
        let usernamesRef = ref.child("users")

        usernamesRef.observeSingleEvent(of: .value, with: { (snapshot) in
            let con = snapshot.value as! [String:[String:Any]]
            var usernamesArray = [String]()
            Array(con.keys).forEach {
                if let res = con[$0] , let username = res["username"] as? String {
                    usernamesArray.append(username)
                }
            }

            for storedUsername in usernamesArray {
                if storedUsername == self.usernameTextField.text! {
                    self.usernameVerified = false
                    self.usernameLabel.textColor = UIColor.red
                    self.usernameLabel.text = "USERNAME TAKEN"
                    self.usernameTextField.layer.addBorder(edge: UIRectEdge.bottom, color: UIColor.red, thickness: 1.5)
                    return
                }
           }


        }) { (error) in
            print(error.localizedDescription)
        }


        print("TEST")
        self.usernameVerified = true
        print(self.usernameVerified)
        self.usernameTextField.layer.addBorder(edge: UIRectEdge.bottom, color: UIColor.black, thickness: 1.5)
        self.usernameLabel.textColor = UIColor.black
        self.usernameLabel.text = "USERNAME"

При нажатии на кнопку входа в систему:

@IBAction func onSignUp(_ sender: Any) {

    print("Sign Up pressed")
    isValidUsername(username: usernameTextField.text!)
    print("[SIGN UP] - Username: \(usernameVerified)")
    isValidEmail(email: emailTextField.text!)
    print("[SIGN UP] - Email: \(emailVerified)")
    isValidPassword(password: passwordTextField.text!)
    print("[SIGN UP] - Password: \(passwordVerified)")



    if passwordVerified && emailVerified && usernameVerified {

        Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!) { (authResult, error) in
            if error != nil {
                self.errorLabel.alpha = 1
                self.errorLabel.text = error?.localizedDescription
                self.shake(viewToShake: self.errorLabel)
                return
            }

            guard let user = authResult?.user else {
                return
            }


            //Successfully Authenticated User
            let ref = Database.database().reference(fromURL: "https://heytest.firebaseio.com/")
            let usersReference = ref.child("users").child(user.uid)
            let values = ["username": self.usernameTextField.text!, "email": self.emailTextField.text!, "games-played": "0"] 
            usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in
                if err != nil {
                    print(err!)
                    return
                }

                //Successfully registered user's data to database
                print("[SIGN UP] - Successfully Signed Up")
                self.errorLabel.alpha = 0
                self.present((self.storyboard?.instantiateViewController(withIdentifier: "TabBarViewController"))!, animated: false, completion: nil)


            })
        }

    } else {

        errorLabel.alpha = 1
        shake(viewToShake: errorLabel)
        print("Password/Email/Username verification not complete!")
        print("[SIGN UP] - Password: \(passwordVerified)")
        print("[SIGN UP] - Username: \(usernameVerified)")
        print("[SIGN UP] - Email: \(emailVerified)")

    }

}

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Я думаю, вам будет легче увидеть, будут ли выбраны какие-либо совпадения из базы данных для конкретного имени пользователя.

let reference = Database.database().reference()
reference.child("users").queryOrdered(byChild: "username").queryEqual(toValue: "yourNewUserName").observeSingleEvent(of: .value) { (snapshot) in
    // if there is data in the snapshot reject the registration else allow it
}

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

0 голосов
/ 19 января 2019

Я делаю это, извлекая каждое имя пользователя из Firebase и запуская его через него, чтобы увидеть, используется ли уже введенное пользователем имя пользователя.

ИМХО это не правильный подход, логика должна обрабатываться серверной стороной. Представьте, если у вас есть 1 миллион пользователей, это никогда не сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...