2017-12-11 1 views
1

Ich baue eine Webanwendung mit Firebase und Angular5. Ich möchte private Räume (mit Passwort geschützt) erstellen/beitreten lassen.Firebase: Ansatz zum Speichern von Raumpasswörtern

Momentan bin ich in der Phase des Entwurfs der Datenbank und kann nicht wirklich sehen, wie ich den Benutzer beim Eingeben des korrekten Raumpassworts überprüfen kann, ohne es tatsächlich aus der Firebase-Datenbank abzurufen (wodurch es völlig unsicher wird).

Sollte ich Cloud-Funktionen für diese Angelegenheit verwenden. Oder kann es direkt mit Firebase gemacht werden und mir fehlt etwas?

Antwort

1

Sie können dies in Firebase tun.

Es sei Teil des DB ist wie angelegt:

/chatRooms/$roomID/password = $PASSWORD

Lese-/Schreibberechtigung für /chatRooms/$roomID/password in den Chatroom Besitzer gewährt wird. chatRooms/$roomId/users/$userId mit folgenden Validierung:

Um Mitglied einer Chatroom zu werden, müssen Sie ein Dokument hinzufügen

Der userId Eintritt der aktuelle Benutzer sein muss, und das Passwortfeld das Kennwort gleich muss. Eine Verifikationsregel kann auf ALLE Daten in der Datenbank zugreifen, selbst wenn der Benutzer nicht auf die Daten zugreifen kann.

Unten ist ein (ungetestetes) Beispiel, das die grundlegenden Prinzipien zeigt.

Kurz:

  1. nur die Chatroom Admin das Passwort festlegen. Niemand darf es lesen.
  2. Chat-Daten können von einem Benutzer gelesen werden, wenn ihre uid in den Mitgliedern Sammlung
  3. sind ein Mitglied der Sammlung hinzuzufügen, müssen sie ein Passwort, gleich (zu der Zeit) das Zimmer Passwort
schreiben

code:

"chatrooms" : {  
    "$room_id" : { 
    "chat data" : { 
     ".read" : "root.child('/chattrooms/' + $room_id + '/members/' + auth.uid).exists()" 
    }, 
    "password": { 
     ".read": "false", 
     ".write": "root.child('/chattrooms/' + $room_id).child('admin').val() == auth.uid" 
    }, 
    "members" : { 
     "$user_id" : { 
     ".validate": "$user_id == auth.uid && newData.val() == root.child('/chattrooms/' + $room_id + '/password').val()" 
     } 
    } 
    } 
} 
+0

Es klingt wie eine vernünftige Lösung. Aber könnten Sie etwas mehr dazu sagen: "Die userID des Eintrags muss der aktuelle Benutzer sein, und das Passwortfeld muss dem Passwort entsprechen. Eine Verifikationsregel kann auf ALLE Daten in der Datenbank zugreifen, auch wenn der Benutzer nicht auf die Daten zugreifen kann. " Sollte ich ein Passwort schreiben wenn ein Benutzer an? chatRooms/$ roomId/users/$ userId Ich bin neu in Firebase-Regeln. –

+0

> und das Passwortfeld muss dem Passwort entsprechen. Das Passwortfeld muss mit welchem ​​Passwort übereinstimmen?Wie stellen wir es zur Verfügung, ohne es tatsächlich in die Datenbank zu schreiben? –

+0

@DaniilAndreyevichBaunov Die Dokumente erklären es hier. https://firebase.google.com/docs/database/security/ Wenn Sie sie lesen, werden Sie verstehen. Der Benutzer muss versuchen, sich selbst in die Sammlung "/ users" zu schreiben. Wenn sie Erfolg haben, müssen sie das Passwort kennen. – z5h

1

Eine Möglichkeit, dies zu tun, die keinen Server erfordert, besteht darin, das Kennwort in den Pfad des Raums einzubetten. Zum Beispiel: Wenn Sie ein Zimmer „allgemeinen“ und das Kennwort „correcthorsebatterystaple“ haben, dann könnte man dies als Modell:

messages 
    general_correcthorsebatterystaple 
roomnames 
    general 

und sichern Sie es mit:

{ 
    rules: { 
    messages: { 
     "$roomid": { 
     ".read": true 
     } 
    "roomnames: { 
     ".read": true 
    } 
    } 
} 

Mit diesen Regeln jemand das lesen kann Liste der Raumnamen. Aber Sie können die Nachrichten eines Raumes nur lesen, wenn Sie auch das Passwort des Namens kennen.

Verwandte Themen