Firebase中的游戏访问令牌

时间:2016-06-23 07:07:16

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

我试图实施一个短令牌系统,允许玩家共享一个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}

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

由于没有办法在安全规则中进行迭代,所以我最终尝试了第二个索引,其中的键被反转以放置某种锁并且丢失了。

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

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

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

令牌

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

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

令牌

1234:{ZZZZ}