我正在尝试非常简单的事情,即将request.auth.uid
与Firebase安全规则中的事务文档(例如此resource.data.useruid
)中的字段值匹配,以便获取特定登录用户的交易。但是,我在查询时没有收到任何文件,而是收到错误。
这就是集合的样子 - 只有一个带有useruid
字段的文档。
字段的值映射到用户 uid (在身份验证 - >用户标签中截取的屏幕截图。
规则看起来像这样
我应该返回一个文档,但每次我用登录的用户查询文档时(我使用angularfire2用于那些目的)我得到Error: Missing or insufficient permissions.
如果我修改规则条件以始终返回true
,或者如果我只检查request.auth.uid
的真实性,我会得到查询结果。有趣的是,涉及resource.data
- 例如。检查firebase规则中amount
字段的值 - 从不满足条件。我试着把它写成
allow read, write: if resource.data.amount == 3
再次出错。好像我根本没有获得resource.data
地图。
我觉得我错过了一些明显的东西,虽然在阅读了指南后,对我来说似乎没问题,我已经没有想法了。调试功能(或缺乏)使整个过程非常缓慢。
您能否向我解释一下,为什么我没有在firebase安全规则中获取resource.data
地图或指向可能出现此问题的地方?
答案 0 :(得分:3)
您很可能错过了文档中的一个特定点:您的查询失败“因为它不包含与您的安全规则相同的约束”。见https://firebase.google.com/docs/firestore/security/rules-query#secure_and_query_documents_based_on_authuid
以下内容与您的安全规则完美配合:
?InitNetwork@@YAHQAD0H@Z
如果删除firebase.auth().signInWithEmailAndPassword("xxxx@xxxx.com", "xxxxx")
.then(function (info) {
db.collection("transactions").where("userid", "==", info.uid).get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
});
});
});
子句,则会收到准确的错误