【发布时间】:2015-04-24 03:23:25
【问题描述】:
我有以下 Firebase 规则,但无法按预期进行验证:
{
"rules": {
".read": true,
".write": true,
"specialItems": {
"$itemid": {
".validate": "root.child('items/' + $itemid).exists()"
}
}
}
}
我的 .validate 规则的目的是,“specialItems”列表中的条目只有在“items”列表中已经存在时才被接受。不幸的是,无论如何,Firebase 都允许我添加到 specialItems - 毫无疑问,因为我误解了验证应该如何工作。
我正在使用应用引擎 python urlfetch API 通过 REST 与 firebase 对话,并使用 PATCH 方法。
auth_payload = {"uid": "custom:1", "auth_data": "foo"}
token = create_token(FIREBASE_SECRET, auth_payload, {"admin": True})
url = "https:/<my-app>.firebaseio.com/specialItems.json?auth=" + token
payload = json.dumps({"myItem": "ok"})
result = urlfetch.fetch(url=url, payload=payload, method=urlfetch.PATCH)
当从一个空数据库开始时,这会给我留下一个完整的数据树,如下所示:
specialItems
-- myItem: "ok"
我期待这棵树无法通过验证规则。我也尝试过使用 PUT,效果相同:
url = "https://<my-app>.firebaseio.com/specialItems/myItem.json?auth=" + token
result = urlfetch.fetch(url=url, payload='"ok"', method=urlfetch.PUT)
要注意的另一件事是,尽管我的规则似乎表明任何人都应该具有读/写访问权限,但我目前需要使用“admin: True”进行身份验证才能写入任何内容。让我想知道我的规则是否正在被应用——如果是这样,那么我不确定如何启用我的规则——它们就在“安全和规则”窗格中。我在这里还假设管理员不允许违反架构验证规则。
【问题讨论】:
-
您需要立即删除根路径上的
.write: true。您基本上已授予世界对您的存储库的全局写入访问权限。 (提示:我可以 curl -x DELETE 在你的根路径上,你将有一个悲伤的一天从备份恢复) -
没关系 - 我专门为这个 SO 问题创建了一个单独的应用程序。现在我已经排序删除它 - 感谢您的帮助。值得注意的是,在创建新的 firebase 应用程序时,默认规则文档是:{ "rules": { ".read": true, ".write": true } } ;)
标签: python google-app-engine firebase rest-firebase