Firebase 规则 query.equalTo 始终在 REST 上返回“权限被拒绝”
Posted
技术标签:
【中文标题】Firebase 规则 query.equalTo 始终在 REST 上返回“权限被拒绝”【英文标题】:Firebase rule query.equalTo always returns "Permission denied" on REST 【发布时间】:2018-07-02 21:31:01 【问题描述】:我正在尝试确保我的数据库安全,我的场景数据如下所示:
receipts: [
userId: id,
...
,
userId: id,
...
,
...
]
每张收据都有userId
字段,其中包含有关其创建者的信息。我想返回特定用户的收据列表。为此,我进行了如下所示的 REST 调用:
https://[PROJ_NAME].firebaseio.com/receipts.json?orderBy="userId"&equalTo="[USER_ID]"&auth=[TOKEN]
并且在所有设置为打开的规则上,它都非常有效。但我想保护我的数据库,这样其他用户就无法通过更改 URL 来查看所有资源。
在 firebase 文档中,我发现了这样的 sn-p:
"baskets":
".read": "auth.uid != null &&
query.orderByChild == 'owner' &&
query.equalTo == auth.uid" // restrict basket access to owner of basket
这似乎是合理的,所以我将它应用到我的配置中,但现在它总是失败。这是我的文件的样子:
"rules":
"receipts":
".indexOn": ["userId"],
".read": "auth.uid != null &&
query.orderByChild == 'userId' &&
query.equalTo == auth.uid"
不幸的是,它总是返回"error" : "Permission denied"
。因为那件事我已经失去了一整天:(
谁能帮帮我?
【问题讨论】:
您是否尝试过引用equalTo
的值?例如equalTo="[USERID]"
是的,引用和orderBy="userId"
一样。
我在security rules documentation 中没有找到关于query
变量的任何内容。我认为您的规则中使用 query
的条款无效。您能否发布指向您发现在规则中使用query
的文档或示例的链接?
@BobSnyder:firebase.google.com/docs/database/security/…我什至不知道这已经发布了,所以需要一点时间来赶上......并可能更新几百个问题来解释“规则现在可以用于过滤数据,如果您确保查询和规则一致”。
根据我使用 android SDK 完成的测试,我同意 equalTo
似乎已损坏。
【参考方案1】:
firebaser 在这里
更新 (2018-01-25):此错误现已修复。由于这是服务器端问题,因此无需更新您的 SDK。
.
原答案如下
目前服务器解释使用query.orderByChild
和query.equalTo
的安全规则的方式存在错误。我们正在努力解决问题。
要暂时解决此问题,您可以将query.startAt
和query.endAt
组合使用以获得相同的结果:
".read": "auth.uid != null &&
query.orderByChild == 'userId' &&
query.startAt == auth.uid &&
query.endAt == auth.uid"
【讨论】:
太棒了!此解决方法按预期工作。我什至不必更改我的查询。以上规则适用于查询 URL 中的equalTo
。
是的,我注意到它适用于相同的查询。我立即尝试查看那里是否存在漏洞。 :-) 如果你找到了,请告诉我!或者,如果您当然发现更多问题。
这总是为我返回 null,即使我有相同 uid 的数据
@FrankvanPuffelen 我想我看到类似的权限被拒绝bug with the startAt rule in this question以上是关于Firebase 规则 query.equalTo 始终在 REST 上返回“权限被拒绝”的主要内容,如果未能解决你的问题,请参考以下文章