即使使用了用户名,注册仍然成功

时间:2019-01-18 21:45:54

标签: swift firebase firebase-realtime-database

我想创建一个系统,如果用户名已被他人使用,则用户无法注册。但是,这似乎不起作用,即使使用了用户名,注册过程仍已完成。

我这样做是通过从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 :(得分:0)

  

我这样做是通过从Firebase检索每个用户名并在其中运行它来查看用户输入的用户名是否已被使用。

这不是正确的方法,应该在服务器端处理逻辑。想象一下,如果您有100万用户,它将永远无法使用。

答案 1 :(得分:0)

我认为您可以更轻松地查看是否从Firebase抛出了特定用户名的任何匹配项。

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
}

否则,您将过多的数据下载到客户端。如果您吸引了更多的用户,那么它也将永远需要下载。