如何防止用户名在Firebase中重复注册?

我想防止重复的用户名,而signUpforms的用户input。 我已经创build了电子邮件login像下面,呃创build用户,然后用用户字典授权setValue。

但是,我使用Firebase安全设置进行堆叠,以及如何检查处理这种情况。

REF_BASE.createUser(email, password: pwd, withValueCompletionBlock: { .. REF_BASE.authUser(email, password: pwd, withCompletionBlock: { .. REF_USERS.childByAppendingPath(uid).setValue(user) 

此处理总是响应错误。

 REF_USERS.childByAppendingPath(uid).childByAppendingPath("username").setValue(user["username"]) { (error: NSError!, result: Firebase!) in if error != nil { print(error.localizedDescription) } else { self.REF_USERS.childByAppendingPath(uid).setValue(user) } } 

这是我的安全规则,我如何修复一切可以防止重复的用户?

 "users": { ".read": "auth !== null", "$user": { "username": { ".read": "auth !== null", ".write": "newData.val() === auth.uid && !data.exists()" } } }, 

更新:

从Frank的回答中,我不知道在这种情况下快速注册新用户时需要做什么。

 app : { users: { "some-user-uid": { email: "test@test.com" username: "myname" } }, usernames: { "myname": "some-user-uid" } } 

我需要为两个不同的节点同时添加相同的用户uid吗? 如果有人在Swift中解释它。 这会很棒。

 "users": { "$uid": { ".write": "auth !== null && auth.uid === $uid", ".read": "auth !== null && auth.provider === 'password'", "username": { ".validate": " !root.child('usernames').child(newData.val()).exists() || root.child('usernames').child(newData.val()).val() == $uid" } } } 

无法将新的用户信息添加用户名父节点。 这需要另一个安全规则?

如果您尝试阻止重复的Firebase用户名,则可以在createUser阶段完成。

假设一个对话框提交给新用户,要求创build一个帐户:这将得到他们想要的用户名和密码。

发送到createUser,如果有错误(因为它已经存在)通知他们,并要求一个不同的userName:

  myRootRef.createUser(email, password: pw, withValueCompletionBlock: { error, result in if error != nil { self.errMsgField.stringValue = "email/username in use, try again" } else { let uid = result["uid"] as! String //the uid of the new user print("user created as \(uid)") self.authUserWithAuthData( email, password: pw ) //auth the user } }) 

用户创build后,你可能会添加他们的信息/用户节点。