繁体   English   中英

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

[英]How to perform server validations based on query results with 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就可以实现的功能。

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

据我可以看到的这些主要选项:

  1. 您在Firebase的安全规则中实现了相同的逻辑
  2. 您可以在自己的服务器上运行此代码,该服务器充当客户端和Firebase之间的中间层
  3. 您可以在自己的服务器上运行此代码,该服务器充当Firebase数据库的“机器人”。

我认为#1是明确的,尽管肯定不是很简单。 例如:Firebase的安全规则无法访问客户端的IP地址,因此您必须找到一种方法(安全地)将其插入数据中。 另外: 在Firebase安全规则中可以进行速率限制 ,但这并不容易。

#2可能也很清楚。 但这会让您使用自定义中间件来保持当前的三层体系结构。 您只需用Firebase替换当前的数据存储即可。 如果这就是您要寻找的,那肯定是最简单的迁移方法。

#3在此博客文章的模式2中进行了描述。 在这种情况下,您可以考虑让客户端将其投票和IP地址写入“登台”节点。 然后,机器人脚本会从登台区域读取它们,验证它们是否在规则内,并写入正式节点(普通客户端无法访问)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM