Javascript Firestore:当前日期小于到期日期的查询子句不';不能使用执行相同检查的规则

Javascript Firestore:当前日期小于到期日期的查询子句不';不能使用执行相同检查的规则,javascript,firebase,google-cloud-firestore,firebase-security,Javascript,Firebase,Google Cloud Firestore,Firebase Security,我有一个集合元素,其中包含开始日期(时间戳数据类型)和结束日期(时间戳数据类型)。 如果我想获取所有元素,其中结束日期大于今天,我会: firebase.firestore().collection('elements')。其中('end','>',new Date()).get(); 这很好用。现在我想在firestore上添加一个具有相同检查的规则,以防止恶意用户使用包含过去日期的new Date()执行此请求并返回过期文档 我向firestore添加了以下规则: match/elemen

我有一个集合
元素
,其中包含
开始
日期(时间戳数据类型)和
结束
日期(时间戳数据类型)。 如果我想获取所有
元素
,其中
结束
日期大于今天,我会:

firebase.firestore().collection('elements')。其中('end','>',new Date()).get();
这很好用。现在我想在firestore上添加一个具有相同检查的规则,以防止恶意用户使用包含过去日期的
new Date()
执行此请求并返回过期文档

我向firestore添加了以下规则:

match/elements/{document=**}{
允许读取:resource.data.end>request.time
}

现在所有查询都返回
FirebaseError:缺少或权限不足
,我不明白为什么。查询正在请求结束日期大于今天日期的所有元素,规则正在验证文档的结束日期是否大于服务器时间。在我看来,这应该是可行的。

问题几乎可以肯定是客户端机器的时钟与谷歌服务器的时钟不匹配。如果客户端时钟的运行速度甚至比谷歌的时钟稍快,则该规则将拒绝查询

您可以尝试从日期添加一些填充,以添加与当前时间的合理偏移:

//从当前时间算起,再加上10秒,以免超出终点
.where('end','>',新日期(Date.now()+10000))

虽然对于时钟与世界标准相当同步的客户端来说,这可能是可行的,但如果客户端的时钟仍然很差,它仍然可能失败。

问题几乎可以肯定,客户端机器的时钟与谷歌服务器的时钟不匹配。如果客户端时钟的运行速度甚至比谷歌的时钟稍快,则该规则将拒绝查询

您可以尝试从日期添加一些填充,以添加与当前时间的合理偏移:

//从当前时间算起,再加上10秒,以免超出终点
.where('end','>',新日期(Date.now()+10000))

虽然对于时钟与世界标准同步的客户机来说,这可能正常工作,但如果客户机的时钟仍然很差,它仍然可能失败。

我立即怀疑您的客户机和服务器上的时间差异。为了排除这种情况,可以尝试传递
.where('end','>',Timestamp.fromMillis(Date.now()+24*60*60*1000))
。如果这样做有效,我们将知道问题是由(客户端和/或时区)的某些偏移引起的。我立即怀疑客户端和服务器上的时间差。为了排除这种情况,可以尝试传递
.where('end','>',Timestamp.fromMillis(Date.now()+24*60*60*1000))
。如果这样做有效,我们将知道问题是由(客户端和/或时区)的某些偏移引起的。我认为这不会改变任何事情,因为所有的
结束日期都比今天提前几天,但可能与我在其他地方读到的内容有关:“Firebase正在验证查询是否与规则匹配,如果通过,则运行查询。“在我的情况下,我请求的日期比请求的日期提前。时间,这样规则就不会总是正确的,即使没有过期的文档,firebase仍然会删除查询。我认为这不会改变任何事情,因为所有的
结束日期都比今天提前几天,但可能与我在其他地方读到的内容有关:“Firebase正在验证查询是否与规则匹配,然后在通过时运行查询。”在我的情况下,我是在请求的日期之前进行请求的。时间,因此该规则并不总是正确的,即使没有过期的文档,Firebase仍然会删除查询。