2017-09-04 3 views
1

Ich habe einen Client, der eine Liste eingeschränkter E-Mails erstellen möchte, die auf die Daten zugreifen können. Jeder, der zur App kommt, kann also überhaupt keine Daten lesen/schreiben (idealerweise kann man sich nicht einmal anmelden, aber das ist mit Firebase nicht möglich?). Irgendwelche Ideen, wie man das macht? Ich hatte daran gedacht, eine Reihe von akzeptierten E-Mails zu verwenden und zu überprüfen, ob ihre E-Mails in den Sicherheitsregeln enthalten waren, aber das schien nicht zu funktionieren. Ich hatte die folgende in der Datenbank:Firebase-Benutzer per E-Mail einschränken

"validEmails": ["[email protected]"]

und dann in den Sicherheitsregeln:

".read": "root.child('validEmails').val().indexOf(auth.token.email) > -1"

Aber es sieht aus wie Sie nicht indexOf in diesen Sicherheitsregeln verwenden können.

Vielleicht muss ich eine Liste von akzeptablen E-Mails haben, und wenn ein Benutzer sich anmeldet, prüft er, ob sie in dieser Liste sind und fügt ihre UID zu einer akzeptierten Liste hinzu? Ich denke, ich könnte das durch eine Cloud-Funktion oder etwas tun?

Jede Hilfe würde sehr geschätzt werden.

Prost

+0

"aber das schien nicht zu funktionieren" Es klingt, als hätten Sie etwas versucht, das hätte funktionieren sollen. Bearbeiten Sie Ihre Frage so, dass sie den [minimalen Code, der das reproduziert, was Sie versucht haben] (http://stackoverflow.com/help/mcve) enthält. Siehe auch diese Antwort für eine allgemeinere "Datenbank nach Domäne sperren" https://stackoverflow.com/questions/36943350/how-do-i-lock-down-firebase-database-to-any-user-from-a -specific-email-domain –

+0

Entschuldigung Frank, ich habe die Frage aktualisiert, um den Code wiederzugeben, den ich ausprobiert habe, der nicht funktioniert hat. –

Antwort

0

Danke Jungs, was ich am Ende eine Liste akzeptabler E-Mails wurde mit bis zu tun:

{ 
    "validEmails": ["[email protected]"], 
    "validUsers": {} 
} 

und dann eine Wolke Funktion laufen müssen zu prüfen, wenn ein Benutzer angemeldet, wenn die E-Mail in der gültigen E-Mail-Liste war . Wenn es dann war, fügte es sie der Liste der gültigen Benutzer hinzu und wenn nicht, löschte es den neu erstellten Benutzer. Ich richte auch Datenregeln ein, so dass nur Benutzer innerhalb von validUsers auf die Daten zugreifen können.

Das Front-End dann die Umleitung usw. für ungültige Benutzer behandelt.

+0

Würden Sie bitte erläutern, wie Sie "eine Cloud-Funktion ausführen lassen, um zu überprüfen, ob sich ein Benutzer angemeldet hat, wenn seine E-Mail in der gültigen E-Mail-Liste enthalten war"? Vielen Dank! –

+1

@ AníbalRivero Firebase ermöglicht das Schreiben von [cloud functions] (https://firebase.google.com/docs/functions/), was im Grunde nur javascript ist, das auf einem node.js Server läuft. Sie greifen auf bestimmte Aktionen zu und ermöglichen Ihnen, Code als Reaktion auf etwas auszuführen. In meinem obigen Beispiel verwende ich 'functions.auth.user(). OnCreate()', um zu überprüfen, ob der gerade angemeldete Benutzer eine E-Mail in der Liste der gültigen E-Mails hat. Wenn nicht, entfernt es sie. –

0

Sobald Sie das Authentifizierungsmodul von Firebase ermöglichen glaube ich Ihnen nicht einschränken können Adressen oder Domänen E-Mail. Sie können Ihre Datenbank jedoch auf andere Weise sichern. Wenn Ihre Benutzer bereits registriert sind und Sie ihre uid kennen, können Sie den Lese- und Schreibzugriff darauf beschränken.

Hier können Sie in der Datenbank ein acl Objekt vorgeben haben, können Sie die Benutzer auflisten und ihr uid mit ihrer Lese-/Schreibberechtigung.

Diese Regeln überprüfen jede Anfrage und erlauben nur autorisierten Benutzern den Zugriff auf die Daten.

{ 
    "acl": { 
    [ 
     { 
     "uid: "abc123" 
     "canRead": true, 
     "canWrite": true 
     }, 
     { 
     "uid": "def456", 
     "canRead": true, 
     "canWrite": false 
     } 
    }, 
    "secure": { 
    ".read": { root.child('acl').child(auth.uid).child('canRead').val() == true } 
    ".write": { root.child('acl').child(auth.uid).child('canWrite').val() == true } 
    } 
} 
+0

Danke, ich fragte mich, ob das der Fall war. Ich muss überdenken, dass sich die Kunden der Situation nähern und sie darum herum aufbauen. –

0

Haben Sie die Liste der zugelassenen Benutzer-E-Mails in der Datenbank:

"whitelist": { 
    "[email protected]%2Ecom": true, 
    "[email protected]%2Ecom": true 
} 

Da Perioden in Schlüssel nicht erlaubt sind, müssen Sie Strings mit Perioden entkommen, bevor sie gespeichert werden.

Dann in den Datenbank-Regeln:

{ 
    "rules": { 
     "whitelist": { 
      ".read": false, 
      ".write": false 
     }, 
     ".read": "root.child('whitelist').child(auth.token.email.replace('.', '%2E')).exists()", 
     ".write": "root.child('whitelist').child(auth.token.email.replace('.', '%2E')).exists()" 
    } 
} 

Benutzer des E-Mail ist über auth.token.email zugänglich. Sie müssen den Punkten entkommen (. ->%2E) und prüfen, ob der Schlüssel auf der Whitelist existiert.

Diese Regeln erlauben keinem Lese- oder Schreibzugriff auf den Abschnitt /whitelist der Datenbank. Änderungen sind nur über die Firebase-Konsole möglich.