我试图实施一个短令牌系统,允许玩家共享一个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})中提取令牌并使用该值来查找打开的游戏。
安全
问题
我不明白如何强制执行每个游戏规则的最后一个令牌。对于他们拥有的游戏,恶意用户可能会使用虚假令牌充斥桌面,并耗尽令牌密钥空间或增加发生冲突的可能性,需要新密钥生成。
tokens
1111:{1234}
1112:{1234}
..
ZZZZ:{1234}
我想我正试图强制执行一个唯一的值而不是键。如果我尝试反转键来实现这一点,我最终需要迭代令牌节点(坏,现在所有令牌都是公共的)来找到相应的gameKey - mref.child('tokens')。orderbyvalue()。equalto({令牌})
由于没有办法在安全规则中进行迭代,所以我最终尝试了第二个索引,其中的键被反转以放置某种锁并且丢失了。
我认为这是一个奇怪的问题:由于我不希望人们迭代我的数据,这种关系变得复杂。
任何帮助将不胜感激
答案 0 :(得分:0)
如果我正确理解这一点,您希望用户只能加入一次游戏。如果是这样,您可以反转标记对象中的键和值,例如
令牌
1234:{1111}
1234:{1112}
..
1234:{ZZZZ}
然后,当用户第二次(或多次)加入时,他们的第一个令牌将被覆盖,因此上述示例变为
令牌
1234:{ZZZZ}