【问题标题】:Game Access Tokens in FirebaseFirebase 中的游戏访问令牌
【发布时间】:2016-06-23 07:07:15
【问题描述】:

我正在尝试实现一个短令牌系统,以允许玩家共享一个 4 位数生成的令牌,以便其他玩家可以找到并加入他们的私人游戏。

由于我是平面数据结构的新手,我无法弄清楚如何在 firebase 中对此进行建模。

这是我目前实现的简化版本。

Users
    {4321}
        displayName
        ….
        openGames
            {1234}

games
    {1234}
        title
        …

openGames
    {1234}
    gameState       
            token
            public
            ...
            timeStamp
tokens
    {AcFk}: {1234}

假设

我不希望登录用户能够迭代令牌、openGames 或游戏节点。

使用令牌

当玩家使用令牌查找游戏时,我从令牌表 root.child(“tokens”).child({AcFk}) 中提取令牌并使用该值查找打开的游戏。

安全

  • 只允许用户为他们拥有的游戏编写代币。这是通过在创建密钥时检查其用户配置文件下是否存在具有该密钥的游戏来完成的;使用安全规则强制执行; “.write”: “root.child('games').child(auth.uid).child(newData.val()).exists()”
  • 每个游戏只允许用户写入一个令牌。

问题

我不明白如何执行每个游戏规则的最后一个令牌。恶意用户可能会用他们拥有的游戏的假令牌充斥表并耗尽令牌密钥空间或增加需要生成新密钥的冲突的可能性。

tokens
    1111:{1234}
    1112:{1234}
    ..
    ZZZZ:{1234}

我想我正在尝试强制执行唯一值而不是键。如果我尝试反转密钥来实现这一点,我最终需要迭代令牌节点(不好,现在所有令牌都是公共的)以找到相应的游戏密钥 - mref.child('tokens').orderbyvalue().equalto({令牌})

由于无法在安全规则中进行迭代,我最终尝试了第二个索引,其中键反转以放置某种锁,结果迷路了。

我认为这是一种奇怪的关系:一种关系由于我不希望人们迭代我的数据而变得复杂。

任何帮助将不胜感激

【问题讨论】:

    标签: firebase firebase-realtime-database firebase-security


    【解决方案1】:

    如果我的理解正确,您希望用户只能加入一次游戏。如果是这样,您可以反转令牌对象中的键和值,例如

    代币

    1234:{1111}
    1234:{1112}
    ..
    1234:{ZZZZ}
    

    然后当用户第二次(或多次)加入时,他们的第一个令牌将被覆盖,因此上面的示例变为

    代币

    1234:{ZZZZ}
    

    【讨论】:

    • 感谢您的回复。程序模拟的游戏实际上是在现实世界中进行的,通常是由以前从未见过面的人组成的。由于各种原因,有时他们将不得不亲自交换令牌,而不是通过电子方式发现。游戏的所有者(发起者)生成代币,任何拥有它的人都可以进入游戏。为此,我需要所有登录用户都能够从 /tokens 集合中读取令牌。
    • 如果我反转密钥,我需要通过 child("tokens").orderbyvalue().equalto({token}) 进行令牌查找。这要求用户能够通过在安全规则中的 /tokens 集合上放置 ".read": "auth != null" 来迭代 /tokens 节点。然后,坚定的用户可以下载整个丢失的令牌。通过抓住孩子(“令牌”)。这就是为什么我使用令牌作为集合的键,这允许我在 /tokens 集合上有 ".read:" "false" 时做一个 child("tokens").child({token} 停止人们迭代它。
    • 这给我留下了尝试在安全级别强制执行的问题,即值(gameid)和密钥(令牌)的唯一性。即一个gameid不应该在集合的值中出现两次,并且令牌不应该在集合的键中出现两次(强制它是一个键,我很高兴碰撞导致写入失败)像“.uniqueIndexOn /token 集合上的“.value”是我想要实现的。我刚刚意识到我应该把它放在顶部。
    猜你喜欢
    • 1970-01-01
    • 2018-10-15
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2018-09-09
    • 2018-01-20
    相关资源
    最近更新 更多