检查唯一用户名时 Firebase 权限被拒绝

Posted

技术标签:

【中文标题】检查唯一用户名时 Firebase 权限被拒绝【英文标题】:Firebase permission denied when checking unique username 【发布时间】:2017-02-12 13:59:07 【问题描述】:

我想检查用户名是否已被使用。当当前用户没有“用户名”的孩子时调用此函数:

func createUsername()

    let userID = FIRAuth.auth()?.currentUser?.uid
    FIRDatabase.database().reference().updateChildValues([
        "users/\(userID!)/username": username.text!,
        "usernames/\(username.text!)": userID!
        ], withCompletionBlock:  (error, reference) in
            if (error != nil) 
                print("disallowed")
                // Write was disallowed because username exists
            
    )

结合本规则:


  "rules": 
    "users": 
      "$uid": 
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid",
        "username": 
      ".read": true,
          ".write": "!data.exists() && newData.exists()",
          ".validate": "newData.isString()"
        
      
    ,
    "usernames": 
      "$username": 
        ".read": true,
        ".write": "!data.exists() && newData.exists()",
        ".validate": "newData.isString() && newData.val() == root.child('users/' + auth.uid + '/username').val()"
      
    
  

我得到了答案:https://groups.google.com/forum/#!topic/firebase-talk/dA1Lkykd-tk 我收到此错误消息:

[Firebase/Database][I-RDB03812] updateChildValues: at / failed: permission_denied

我不确定为什么这不起作用。我也试过这个答案:Firebase android : make username unique 但这对我不起作用。规则有问题,但我不知道是什么。

更新,规则变化不大,还是一样的错误:


  "rules": 
    "users": 
      "$uid": 
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid",
        "username": 
      ".read": true,
          ".write": "!data.exists() && newData.exists()",
          ".validate": "newData.isString()"
        
      
    ,
    "usernames": 
      "$username": 
        ".read": true,
        ".write": "!data.exists() && newData.exists()",
        ".validate": "newData.isString() && newData.val() == newData.parent().parent().child('users/' + auth.uid + '/username').val()"
      
    
  

我也改变了 parent() 的东西,但它也不起作用。我变成了4个父母,0个父母。同样的错误。

【问题讨论】:

【参考方案1】:

更新:问题出在这条验证规则上:

".validate": "newData.isString() && newData.val() == root.child('users/' + auth.uid + '/username').val()"

您正在将新数据与 当前 根进行比较。由于用户刚刚创建,/users/$uid 尚不存在。

您要做的是将新数据与 new 用户节点进行比较。要到达此节点,您应该在比较时从 newData 导航到 new 根:

".validate": "newData.isString() && 
  newData.val() == newData.parent().parent().child('users/' + auth.uid + '/username').val()"

我将在下面留下我之前的回复,因为它可能有助于学习如何解决此类问题。

我刚刚将您的规则粘贴到我的一个项目中,稍微简化了它们并毫无问题地使用了您的代码。我不确定你为什么会遇到问题。

代码:

    FIRAuth.auth()?.signInAnonymously(completion:  (user, error) in
        let username = "puf"
        let userID = FIRAuth.auth()?.currentUser?.uid
        self.ref.child("42188459").updateChildValues([
            "users/\(userID!)/username": username,
            "usernames/\(username)": userID!
        ], withCompletionBlock:  (error, reference) in
            if (error != nil) 
                print("disallowed")
                // Write was disallowed because username exists
            
        )
    )

规则sn-p:

  "users": 
    "$uid": 
      ".write": "$uid === auth.uid",
      "username": 
        ".write": "!data.exists() && newData.exists()",
      
    
  ,
  "usernames": 
    "$username": 
      ".write": "!data.exists() && newData.exists()",
    
  

生成的 JSON:


  "usernames" : 
    "puf" : "DBP4Pw3uiwQfUaDJw1XBR8oFBUK2"
  ,
  "users" : 
    "DBP4Pw3uiwQfUaDJw1XBR8oFBUK2" : 
      "username" : "puf"
    
  

【讨论】:

我复制了您的更新规则并将其替换为旧值。但是,我仍然收到错误消息。此错误发生在 .validate 行,即我刚刚复制的规则。在 Firebase 的模拟器中,我也收到错误消息。我有这些设置:写入,位置:/usernames/dfggdfg/,json 值:“key”:“value”,验证:YES,然后执行。阅读有效,但写作仍有一些问题。其余规则与上述完全相同。我将更新我正在使用的当前规则。 XCode 仍然给出同样的错误。

以上是关于检查唯一用户名时 Firebase 权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

批量用户订阅 Firebase 中的主题时出现权限被拒绝错误

React/Rebase/Firebase 警告:权限被拒绝 - 如何添加用户身份验证?

Firebase 规则 - 权限被拒绝

即使用户授予位置权限检查,三星 note 20 也总是会被拒绝

Swift:Firebase 读取权限被拒绝

我想检索用户生成的数据,但在Firebase中获取权限被拒绝错误