Erzwingen eindeutiger Benutzernamen mit Firebase simplelogin

8

Ich habe kürzlich ein Tutorial über Thinkster zum Erstellen einer Web-App mit Angular und Firebase verfolgt .

Das Tutorial verwendet die Firebase simpleLogin-Methode, mit der ein 'Profil' erstellt werden kann, das einen Benutzernamen enthält.

Fabrik:

%Vor%

Controller:

%Vor%

Ganz am Ende des Tutorials gibt es einen Abschnitt "nächste Schritte", der Folgendes enthält:

  

Erzwingen Sie die Eindeutigkeit des Benutzernamens - diese ist knifflig, überprüfen Sie die Firebase-Prioritäten und sehen Sie, ob Sie sie verwenden können, um Benutzerprofile nach Benutzername abzufragen

Ich habe gesucht und gesucht, kann aber keine klare Erklärung dafür finden, insbesondere was die setPriority () Funktion von Firebase

Ich bin ziemlich der Firebase-Neuling, also würde jede Hilfe hier dankbar empfangen werden.

Es gibt ein paar ähnliche Fragen , aber ich kann mich nicht darum kümmern, wie ich das klären kann.

Enormer Dank im Voraus.

BEARBEITEN

Aus Mareins Antwort habe ich die Registerfunktion in meinem Controller auf:

aktualisiert %Vor%

Aber es wirft einen 'undefined ist keine Funktion' Fehler in der Zeile var q = ref.child('profile').orderByChild('username').equalTo($scope.user.username); . Ich habe den Code nachher auskommentiert und nur console.log (q) versucht aber trotzdem keine Freude.

BEARBEITEN 2

Das Problem mit dem oben genannten war, dass das Thinkster-Tutorial Firebase 0.8 verwendet und orderByChild nur in späteren Versionen verfügbar ist. Aktualisiert und Mareins Antwort ist perfekt.

    
Nick Moreton 30.04.2015, 14:39
quelle

2 Antworten

16

Hier gibt es zwei Dinge zu tun, eine clientseitige Prüfung und eine serverseitige Regel.

Auf der Client-Seite möchten Sie überprüfen, ob der Benutzername bereits existiert, so dass Sie dem Benutzer mitteilen können, dass seine Eingabe ungültig ist, bevor Sie ihn an den Server senden. Wo genau Sie dies implementieren, aber der Code würde etwa so aussehen:

%Vor%

Sie können dies vor dem Schreiben auf den Server überprüfen. Was ist jedoch, wenn ein Benutzer böswillig ist und beschließt, die JS-Konsole zu verwenden, um trotzdem auf den Server zu schreiben? Um dies zu verhindern, benötigen Sie serverseitige Sicherheit.

Ich habe versucht, eine Beispiellösung zu finden, aber ich stieß auf ein Problem. Hoffentlich wird jemand erfahrener mitkommen. Mein Problem ist wie folgt. Angenommen, Ihre Datenbankstruktur sieht so aus:

%Vor%

Wenn Sie ein neues Profil hinzufügen, möchten Sie eine Regel, die sicherstellt, dass kein Profilobjekt mit der gleichen Eigenschaft username existiert. Soweit ich weiß, unterstützt die Firebase-Sicherheitssprache dies jedoch nicht mit dieser Datenstruktur.

Eine Lösung wäre, die Datenstruktur so zu ändern, dass username als Schlüssel für jedes Profil verwendet wird (anstelle von profile1 , profile2 , ...). So kann es immer nur ein Objekt mit diesem Benutzernamen geben. Datenbankstruktur wäre:

%Vor%

Dies könnte in diesem Fall eine praktikable Lösung sein. Was aber, wenn nicht nur der Benutzername, sondern beispielsweise auch die E-Mail eindeutig sein muss? Sie können nicht beide der Objektschlüssel sein (außer wir verwenden String-Verkettungen ...).

Eine weitere Sache, die Ihnen in den Sinn kommt, besteht darin, zusätzlich zu der Liste der Profile eine separate Liste von Benutzernamen und eine separate Liste von E-Mails zu führen. Diese können dann leicht in Sicherheitsregeln verwendet werden, um zu überprüfen, ob der angegebene Benutzername und die E-Mail bereits vorhanden sind. Die Regeln würden etwa so aussehen:

%Vor%

Aber jetzt stoßen wir auf ein anderes Problem; Wie kann sichergestellt werden, dass bei der Erstellung eines neuen Profils der Benutzername (und die E-Mail-Adresse) ebenfalls in diese neuen Listen aufgenommen wird? [1]

Dies kann wiederum gelöst werden, indem der Profilerstellungscode aus dem Client genommen und stattdessen auf einem Server abgelegt wird. Der Client müsste dann den Server bitten, ein neues Profil zu erstellen, und der Server würde sicherstellen, dass alle notwendigen Aufgaben ausgeführt werden.

Wie es scheint, sind wir jedoch sehr weit unten in ein Loch gegangen, um diese Frage zu beantworten. Vielleicht habe ich etwas übersehen und die Dinge sind einfacher als sie scheinen. Irgendwelche Gedanken werden geschätzt.

Ich entschuldige mich auch, wenn diese Antwort eher eine Frage als eine Antwort ist, ich bin neu in SO und bin mir noch nicht sicher, was als Antwort angemessen ist.

[1] Obwohl Sie vielleicht argumentieren könnten, dass dies nicht sichergestellt werden muss, da ein böswilliger Benutzer sich nur selbst Schaden zufügen würde, indem er nicht seine einzigartige Identität beansprucht?

    
Marein 01.05.2015, 08:34
quelle
-1

Ich hatte ein ähnliches Problem. Aber es war nach der Registrierung des Benutzers mit Passwort und E-Mail. Im Benutzerprofil könnte ein Benutzername gespeichert werden, der eindeutig sein muss und ich eine Lösung gefunden habe, vielleicht kann diese Ihnen dienen.

Abfrage nach dem in Firebase eindeutigen Benutzernamen

%Vor%     
manguiti 26.02.2016 17:08
quelle

Tags und Links