由Firebase规则阻止的唯一用户名

时间:2018-01-10 22:45:01

标签: ios swift firebase firebase-realtime-database firebase-authentication

因此,在我目前的iOS应用程序中,我正在使用firebase,我目前正在努力使其成为所有用户在注册阶段拥有唯一的用户名。我有这个功能似乎可以检查用户名是否存在。

//will ensure that a user has a unique username
static func checkUserNameAlreadyExist(newUserName: String, completion: @escaping(Bool) -> Void) {
    let ref = Database.database().reference()
    ref.child("users").queryOrdered(byChild: "username").queryEqual(toValue: newUserName)
        .observeSingleEvent(of: .value, with: {(snapshot: DataSnapshot) in
            if snapshot.exists() {
                completion(true)
            }
            else {
                completion(false)
            }
        })
}

但是,当我尝试在注册屏幕中创建用户时运行此功能。它没有这样做并且给出了这个错误

Listener at /users failed: permission_denied

我得出的结论是,它与我目前默认的规则有关。

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    ".indexOn": "g"
  }
}

所以我的问题是......无论如何,我可以更改我的规则以使用此功能,因为我不想在检查用户名是否唯一之前验证用户。如果采用了许多用户名,这可能会使成千上万的人加入到auth中。非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

这里有很多潜在的解决方案。这里有一些我的头脑:

  1. 您可以允许任何人阅读您的JOIN文件。如果没有任何敏感信息,那么允许这样做可能是有意义的,尽管你可能正确地要求用户至少经过身份验证。
  2. 此解决方案如下所示:

    users
    1. 用户是使用电子邮件还是Facebook登录?如果是这样,您可以让他们进行身份验证,然后在对他们进行身份验证后,要求他们选择用户名,此时他们可以在{ "rules": { "users": { ".read": true, ".write": "auth != null" } } } 文档中查询有效的用户名。
    2. 此处不需要示例代码,就像您在调用函数中的函数之前等待用户进行身份验证一样,该函数将在此时运行。然后,您只需要在users文档中更新该用户的username密钥。

      1. 您可以维护一个单独的文档来跟踪使用过的用户名,并使所有人都能阅读该文档。这样,未经身份验证的用户就可以检查他们的用户名,但他们无法访问您的Firebase数据库的任何其他部分。
      2. 要执行此操作,您必须创建一个新文档(让我们称之为users),每次用户成功进行身份验证时,都要将它们添加到usernames文档中,然后添加它们user文档的用户名。然后,您可以在我的第一个示例中设置username的权限:

        usernames