Firebase ios无法获取时间戳[Firebase / Database] [I-RDB038012] / serverTimestamp处的侦听器失败:Permission_denied

时间:2018-11-09 03:38:24

标签: ios swift firebase firebase-realtime-database

我正在使用此代码

var currentTimeStamp: TimeInterval?

    let ref = Database.database().reference().child("serverTimestamp")

    ref.setValue(ServerValue.timestamp())

    ref.observe(.value, with: { snap in

        if let t = snap.value as? Timestamp {
           // print(t/1000)
           // currentTimeStamp = t/1000

            //Add additional data(Timestamp) to list
            mutableData["timestamp"] = currentTimeStamp

            //FINALLY , set data
            newdoc.setData(mutableData) { (error) in
                completion(docID)
            }
        }
    })

遇到此错误

Firebase/Database][I-RDB038012] Listener at /serverTimestamp failed: permission_denied

我的规则设置为Auth,但是auth用户仍然无法获取时间戳

// These rules grant access to a node matching the authenticated
// user's ID from the Firebase auth token
{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

我要在Firebase Realtime Database中写入时间戳,当前结构为。

myproject [空]     | ____ serverTimestamp:1

以为我已经设定了完​​整的规则,但仍然无法获取时间戳

1 个答案:

答案 0 :(得分:0)

您为用户节点设置了规则。您还需要为“ serverTimestamp”节点指定规则。

    {
      "rules": {
        "users": {
           "$uid": {
              ".read": "$uid === auth.uid",
              ".write": "$uid === auth.uid"
           }
        },
        "serverTimestamp": {
           ".read": "auth_uid != null",
           ".write": "auth_uid != null"
        }
      }
    }

这是如果您保持结构不变。

在Firebase中指定规则时,它们使用的术语是原子的,您需要为每个节点指定规则,并且每个子节点在应用自己的规则之前先应用父规则。您的规则仅适用于“ $ uid”节点,您没有为“ serverTimestamp”指定任何规则,并且由于“ serverTimestamp”不属于“ $ uid”权限,因此被拒绝。

例如,使用您当前的权限,如果您尝试读取/写入“用户”节点,您还将获得拒绝权限。您只能访问“用户/($ uid)/”