Ich versuche, ein kurzes Tokensystem zu implementieren, das es Spielern ermöglicht, ein 4-stelliges generiertes Token zu teilen, damit andere Spieler ihr privates Spiel finden und diesem beitreten können.Spielzugriffstoken in Firebase
Ich habe Probleme herauszufinden, wie man dies in Firebase modelliert, wie ich zu flachen Datenstrukturen neu bin.
Hier ist eine vereinfachte Version von dem, was ich derzeit implementiert habe.
Users
{4321}
displayName
….
openGames
{1234}
games
{1234}
title
…
openGames
{1234}
gameState
token
public
...
timeStamp
tokens
{AcFk}: {1234}
Annahmen
ich in die Benutzer nicht die Token, openGames oder Spiele Knoten zu durchlaufen können protokolliert werden sollen.
ein Token
Wenn ein Spieler ein Token ein Spiel finden verwendet, ziehe ich das Token aus der Token-Tabelle root.child („Token“). Kind ({AcFk}) und verwenden Sie die Wert, um das offene Spiel zu finden.
Sicherheit
- erlauben nur ein Benutzer ein Token für ein Spiel zu schreiben, die sie besitzen. Dies geschieht, indem überprüft wird, dass ein Spiel mit dem Schlüssel unter ihrem Benutzerprofil existiert, wenn der Schlüssel erstellt wird; erzwungen mit einer Sicherheitsregel; ".write": "root.child ('Spiele'). Child (auth.uid) .child (newData.val()). Exists()"
- Nur einem Benutzer erlauben, einen Token pro Spiel zu schreiben.
Problem
Ich verstehe nicht, wie das Endergebnis ein Token pro Spiel Regel zu erzwingen. Ein böswilliger Benutzer könnte die Tabelle mit gefälschten Token für ein Spiel überschwemmen, das ihm gehört, und den Token-Schlüsselraum erschöpfen oder die Wahrscheinlichkeit einer Kollision erhöhen, die eine neue Schlüsselgenerierung erfordert.
tokens
1111:{1234}
1112:{1234}
..
ZZZZ:{1234}
Ich denke, ich versuche, einen eindeutigen Wert statt Schlüssel zu erzwingen. Wenn ich versuche, die Schlüssel umzukehren, muss ich den Tokenknoten iterieren (schlecht, jetzt sind alle Token öffentlich), um den entsprechenden Spielschlüssel zu finden - mref.child ('Token'). Orderbyvalue(). Token})
Da es keine Möglichkeit gibt, in einer Sicherheitsregel zu iterieren, versuchte ich einen zweiten Index mit den umgedrehten Schlüsseln, um eine Art Sperre zu setzen und bin einfach verloren gegangen.
Ich denke, das ist eine komische Sache: Eine Beziehung, die dadurch kompliziert ist, dass ich nicht möchte, dass Leute meine Daten iterieren.
Jede Hilfe wäre
Danke für die Antwort. Das Spiel der Programmmodelle findet tatsächlich in der realen Welt statt, oft von Leuten, die sich noch nie zuvor getroffen haben und in großen Gruppen sind. Aus verschiedenen Gründen müssen sie manchmal das Token persönlich austauschen, anstatt es elektronisch zu entdecken. Der Besitzer (Urheber) des Spiels generiert das Token und jeder, der es hat, kann das Spiel betreten. Dazu brauche ich alle angemeldeten Benutzer, um ein Token aus der/tokens-Sammlung lesen zu können. –
Wenn ich die Schlüssel umkehren würde, müsste ich das Token-Lookup über Kind ("Token") machen. Orderbyvalue(). Equalto ({token}). Dies erfordert, dass der Benutzer in der Lage ist, den/tokens-Knoten zu iterieren, indem er in den Sicherheitsregeln ein ".read": "auth! = Null" in der Sammlung/tokens platziert. Ein bestimmter Benutzer könnte dann nur einen ganzen verlorenen Token herunterladen. durch Ergreifen von Kind ("Tokens"). Deshalb habe ich das Token als Schlüssel für die Sammlung verwendet, dies erlaubt mir, ein Kind ("Token"). Child ({token} während ".read:" "false" in der Sammlung/token) um Leute daran zu hindern, es zu wiederholen –
Das lässt mich dann mit dem Problem des Erzwingens auf der Sicherheitsstufe, der Eindeutigkeit sowohl des Wertes (Spiel) als auch des Schlüssels (Spielmarke) umgehen Dh ein Spiel sollte nie zweimal in der erscheinen Wert der Sammlung und des Tokens sollte niemals zweimal im Schlüssel der Sammlung erscheinen (erzwingt durch die Tatsache, dass es ein Schlüssel ist und ich bin glücklich, dass Kollisionen einen Schreibvorgang nicht bestehen) Etwas wie ".uniqueIndexOn" ".value" auf der/Token-Sammlung ist, was ich versuche zu erreichen. Ich habe gerade festgestellt, ich hätte dies an die Spitze gesetzt. –