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

时间:2016-04-28 13:00:09

标签: ios swift firebase firebase-security firebase-authentication

我希望在用户输入的signUp表单中防止重复的用户名。我创建了如下所示的电子邮件登录,firtly createUser,然后用用户字典验证它的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的答案,但我不知道在这种情况下为swift注册新用户时我需要做什么。

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"
    }
  }
}

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

1 个答案:

答案 0 :(得分:0)

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

假设向新用户提出了一个对话框,要求创建一个帐户:这将获得他们想要的用户名和密码。

将其发送到createUser并且如果出现错误(因为它已经存在),请通知他们并要求使用其他用户名:

    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
        }
    })

创建用户后,您可能也会将其信息添加到/ users节点。