2016-06-23 10 views
1

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

Antwort

0

zu schätzen, wenn ich das Sie richtig ein Benutzer in der Lage sein wollen, zu verstehen, bin nur einmal an einem Spiel teilzunehmen.Wenn dies der Fall könnten Sie den Schlüssel und den Wert in Ihrem Token-Objekt zum Beispiel

Token

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

dann umkehren, wenn ein Benutzer ein zweites Mal (oder mehrmals) ihre ersten Token überschrieben werden kommen, so dass die oben Beispiel wird

Token

1234:{ZZZZ} 
+0

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. –

+0

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 –

+0

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. –