【发布时间】: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