小编jor*_*aff的帖子

比较 Firestore 规则中的文档时间戳

我在编写和测试 Firestore 规则时遇到了一个奇怪的问题。这就是我想要实现的目标:

  • 当应用程序启动时,用户会匿名登录。用户开始新游戏。
  • 我创建了一个基本上仅包含时间戳的“会话”。
  • 玩家玩游戏,获得一定的高分,然后转到可以将分数发送到全局高分列表的屏幕。提交高分后,我会检查该玩家是否存在现有会话,以及已经过去的时间是否足够长以使高分被视为有效。

在客户端(javascript)上,我使用以下行发送文档中的时间戳:

firebase.firestore.FieldValue.serverTimestamp()
Run Code Online (Sandbox Code Playgroud)

这是当前的规则集。可以看到,只有当新的higscore的createdAt晚于session的createdAt时,才能创建分数。

service cloud.firestore {
    match /databases/{database}/documents {
        function isValidNewScoreEntry() {
            return request.resource.data.keys().hasOnly(['createdAt', 'name', 'score']) &&
            request.resource.data.createdAt is timestamp &&
            request.resource.data.name is string &&
            request.resource.data.score is int &&
            request.resource.data.name.size() <= 20
        }

        match /highscores/{entry} {
            allow list: if request.query.limit <= 10;
            allow get: if true; 
            allow create: if isValidNewScoreEntry() &&
      request.resource.data.createdAt > get(/databases/$(database)/documents/sessions/$(request.auth.uid)).data.createdAt;
        }

        function isValidNewSession() {
            return request.resource.data.keys().hasOnly(['createdAt']) &&
            request.resource.data.createdAt is timestamp
        }

        match /sessions/{entry} {
            allow list: if false;
            allow get: …
Run Code Online (Sandbox Code Playgroud)

firebase-security google-cloud-firestore

5
推荐指数
1
解决办法
1367
查看次数