【问题标题】:Firebase username uniqueness in SwiftSwift 中的 Firebase 用户名唯一性
【发布时间】:2017-03-29 21:38:36
【问题描述】:

我正在尝试在注册用户时检查用户名的唯一性。我知道有很多关于它的问题,我已经解决了所有问题,但我的问题是它什么也没做,它不打印用户名存在,甚至不使用用户名注册。

我做错了什么?我似乎找不到答案,唯一可能出错的是 if 嵌套。

这是结构:

AppName:
    users
     1v2mRJTvrBQ7dMQohUU3rnn7ypI3: //UID
     username: John

这就是代码:

func registerUser(){
        guard let username = usernameField.text, let email = emailField.text, let password = passwordField.text else{
            print("Successfully registered")
            return
        }
        if connectedToNetwork() == true{
            if passwordField.text == confirmPasswordField.text{
                let usersRef = FIRDatabase.database().reference().child("users")
                usersRef.queryOrdered(byChild: "username").queryEqual(toValue: "\(username)")
                .observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in
                    if snapshot.value is NSNull{

                AuthProvider.Instance.register(withEmail: email, password: password, username: username, loginHandler: { (errMessage) in
                    if errMessage != nil{

                    }else{
                        let user = FIRAuth.auth()?.currentUser
                        guard let uid = user?.uid else{
                            return
                        }
                        user?.sendEmailVerification() { error in
                            if let error = error {
                                print(error.localizedDescription)
                            } else {
                                print("Email has been sent to you!")
                            }
                        }
                        //User logged in and redirect

                    }
                })
                    }else{
                    print("Username already exists")// It doesn't execute this
                    }
                })
            }else{
                Util.errorAlert(message: "Passwords do not match!")
            }
        }else{
            Util.errorAlert(message: "The internet connection appears to be offline.")
        }
    }

我什至尝试了不同的安全规则,但除了我使用的那些不应该有任何区别:

{ 
"rules": { 
".read": "auth != null", 
".write": "auth != null", 
"Snuses": { 
".indexOn": "Brand",
    "$username": {
        ".validate": "!root.child(users').hasChild($username)"
    }
} 
} 
}

我做错了什么?

【问题讨论】:

  • 看起来不错。问题是什么?你遇到了什么错误?
  • 什么都没有,没有错误,什么都没有。
  • 你检查了所有的左括号和右括号吗?可能部分代码没有被执行。
  • 是的,我检查了所有这些都是正确的。

标签: swift firebase firebase-realtime-database firebase-security


【解决方案1】:

您的问题在于您的安全规则。您正在对用户进行身份验证之前进行查询。此查询将失败,因为您的规则规定用户必须经过身份验证才能查询数据库(auth != null)。

您需要做的是创建另一个名为“用户名”的孩子。使任何人无需身份验证即可阅读此内容。检查用户名是否被使用,如果没有,则为新用户声明它。然后,进行身份验证调用并在“用户”子级中创建您的用户。

【讨论】:

    【解决方案2】:

    对 Firebase 一无所知,您“知道它正在做某事”的方式似乎是警报或打印。因此,如果它不这样做,我会看到至少有两个执行路径不会以警报或打印结束。

    if errMessage != nil{

    guard let uid = user?.uid else{

    这也可能缺少else,但我无法以足以回答 S.O. 的努力程度找到它。问题:

    if snapshot.value is NSNull{

    纯理论上,你的Util.errorAlert也可能坏了。

    【讨论】:

      【解决方案3】:

      Firebase 不允许重复的用户(名称),因此请在尝试创建用户时查找错误。

      FIRAuth.auth()?.createUser(withEmail: email, password: password) { (user, error) in
        // ...
      }
      

      可能会返回 4 个错误:

      FIRAuthErrorCodeInvalidEmail
           Indicates the email address is malformed.
      
      FIRAuthErrorCodeEmailAlreadyInUse  (this is the one to address you question)
           Indicates the email used to attempt sign up already exists. Call 
           fetchProvidersForEmail to check which sign-in mechanisms such
           user used, and prompt the user to sign in with one of those.
      
      FIRAuthErrorCodeOperationNotAllowed
           Indicates that email and password accounts are not enabled. Enable them in the
           Authentication section of the Firebase console.
      
      FIRAuthErrorCodeWeakPassword
           Indicates an attempt to set a password that is considered too weak. The 
           NSLocalizedFailureReasonErrorKey field in the NSError.userInfo
           dictionary object will contain more detailed explanation that can
           be shown to the user.
      

      【讨论】:

      • 但它不检查用户名。电子邮件工作正常,但我还需要检查用户名,该用户名存储在 Firebase 数据库中。
      • @TarvoMäesepp 您存储在 firebase 中的用户名是否与 firebase 用户名相同?它通常是相同的,但您可能有不同的用例。即,当您创建用户时,使用他们的电子邮件地址完成,然后通过您的代码将其存储在您的 /users 中。
      • 我在注册后将 "username": "usernameField.text" 存储到用户节点下的 firebase 数据库中,还包含其他一些详细信息。那么有什么更好的规则呢? firebase 用户名是什么意思?
      • @TarvoMäesepp 创建/注册 Firebase 用户时,需要使用用户名(电子邮件)和密码。通常,您的 Firebase 结构包含一个 /users 节点,该节点内的子节点是该用户的 uid,子节点包含有关该用户的其他详细信息;地址等。您的目标是防止重复的用户名,这可以在没有规则的情况下完成。当您创建 Firebase 用户(使用他们的电子邮件)时,如果该用户名(电子邮件)已作为 Firebase 用户存在,则 Firebase 将引发错误。注意该错误并在收到错误时采取措施,否则继续。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 2016-09-27
      • 2020-02-06
      • 1970-01-01
      • 2017-10-13
      相关资源
      最近更新 更多