如何解决Firestore:当前日期小于到期日期的查询子句不适用于执行相同检查的规则
我有一个elements
集合,其文档包含start
日期(时间戳数据类型)和end
日期(时间戳数据类型)。
如果我想获得所有elements
日期大于今天的end
,我可以这样做:
firebase.firestore().collection('elements').where('end','>',new Date()).get();
这很好用。现在,我想添加一条对firestore进行相同检查的规则,以防止恶意用户使用包含过去日期的new Date()
执行此请求并返回过期的文档。
我在Firestore中添加了以下规则:
match /elements/{document=**} {
allow read: resource.data.end > request.time
}
现在所有查询都返回FirebaseError: Missing or insufficient permissions
,我不明白为什么。该查询正在请求结束日期大于当前日期的所有元素,并且该规则正在验证文档的结束日期大于服务器时间。我认为这应该可行。
解决方法
问题几乎可以肯定是客户端计算机的时钟与Google服务器的时钟不匹配。如果客户端时钟的运行速度甚至比Google时钟的运行速度稍快,该规则将拒绝查询。
您可以尝试从日期开始添加一些填充以从当前时间添加合理的偏移量:
// add 10 seconds from current time so as not to undershoot the end
.where('end','>',new Date(Date.now() + 10000))
虽然这对于某些时钟可以与世界标准合理同步的客户端来说可以正常工作,但是如果客户端的时钟距离仍然很远,它仍然可能会失败。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。