如何根据Firebase的查询结果执行服务器验证?

时间:2015-12-03 15:35:46

标签: javascript validation coffeescript firebase

插入记录时,我需要能够在服务器上运行一个或多个查询,如果找到任何结果,将拒绝该插入。 Firebase允许我这样做吗?它无法在客户端上指定,也可能很容易被破坏。

对于一个更具体的例子,我有一个Meteor应用程序,目前让我用一些非常简单的代码限制投票。我想在Firebase中实现它。 (请原谅CoffeeScript)

    @VoteFrequency =

      votesPer: (sinceDelta, sinceUnit) ->
        Votes.find(
          pollId: @pollId
          ip: @ip
          createdAt:
            $gte: moment().add(-sinceDelta, sinceUnit).toDate()
        ).count()

      withinLimits: (ip, pollId) ->
        @ip = ip
        @pollId = pollId

        # Allow x votes per y seconds
        @votesPer(10, 'seconds') < 1 &&
          @votesPer(1, 'hours') < 15 &&
          @votesPer(1, 'days') < 150

如您所见,它查询数据库以查找与IP地址匹配的先前投票,并且比时间戳更新(使用当前时间的增量 - 间隔计算)。如果它找到任何这些限制的任何结果,它将返回false,告诉调用者不要插入新的投票。

要明确的是,我并没有找到一个解决方案,我将自己的服务器添加到混合中。一旦我必须这样做,FireBase至少会对我失去吸引力。

从目前为止我所知道的情况来看,这似乎并不是我只能使用浏览器/本机客户端和firebase实现的。

1 个答案:

答案 0 :(得分:1)

您无法在Firebase的服务器上运行自己的代码。因此,尝试将现有的三层解决方案映射到Firebase需要的不仅仅是评估如何移植每个脚本。

据我所知,有这些主要选项:

  1. 您在Firebase's security rules
  2. 中实现了相同的逻辑
  3. 您在自己的服务器上运行此代码,该服务器充当您的客户端和Firebase之间的中间层
  4. 您在自己的服务器上运行此代码,该服务器充当Firebase数据库的“僵尸程序”。
  5. 我认为#1是明确的,但肯定不是微不足道的。例如:Firebase的安全规则无法访问客户端的IP地址,因此您必须找到一种方法(安全地)将其插入到数据中。另外:rate-limiting is possible in Firebase security rules,但不容易。

    #2可能也很清楚。但它会让您使用自定义中间件来保持当前的三层架构。您只需使用Firebase替换当前的数据存储。如果这正是您所寻找的,那么这绝对是最简单的迁移方法。

    this blog post的模式2中描述了

    #3。在这种情况下,您可以考虑让客户将其投票和IP地址写入“暂存”节点。然后,bot脚本从暂存区域读取它们,验证它们是否在规则范围内并写入官方节点(常规客户端无权访问)。