如何编写 Firebase 安全规则,让未经身份验证的用户可以写入但只有我信任的服务器可以读取?

How do I write a Firebase security rule where unauthenticated users can write but only my trusted server can read?

我想写一条规则,从网页(未经身份验证)提交表单的人可以 .write 并且只有服务器可以 .read 两分钟之前的消息。

服务器(App Engine Python-Flask 实例)每两分钟轮询一次 Firebase,但我不断收到 JSON 反馈 {error: Permission Denied},而不是我请求的数据。

安全规则如下所示:

{
"rules": {
    "leads": {
        ".write": true, 
        "$user_id": {
            ".write": true,
            ".read": "auth !== null && $user_id === auth.uid && data.child('CREATED').val() > (now - 120000)"
            }
        }
    }
}

模拟器告诉我:

Attempt to read /leads with auth={"provider":"custom","uid":"lead_checker"}
    /
    /leads

No .read rule allowed the operation.
Read was denied.

任何人都可以发现我做错了什么或提供合适的替代品吗?

当你的读取规则中有像$user_id === auth.uid这样的子句时,它表示:当当前用户的uid与节点名称匹配时,可以读取此数据。所以对于您的用户 lead_checker 意味着它可以读取名为 lead_checker.

的节点

您可能想要做的是允许 lead_checker 读取每个用户节点:

{
  "rules": {
    "leads": {
        "$user_id": {
            ".write": true,
            ".read": "auth.uid == 'lead_checker'"
        }
    }
  }
}

有了这个,领导检查员可以到达 leads 下的每个节点。请注意,它仍然无法读取 leads 节点本身。如果需要,将读取规则向上移动一级:

{
  "rules": {
    "leads": {
        ".read": "auth.uid == 'lead_checker'"
        "$user_id": {
            ".write": true,
        }
    }
  }
}