2016-12-29 3 views
0

Ich versuche zu überprüfen, ob der Benutzername, den der Benutzer eingegeben hat, genommen wurde. Der Code überprüft derzeit, ob die E-Mail verwendet wird, und erstellt den Benutzer, falls dieser nicht vorhanden ist. Wie kann ich dies dazu bringen, die Datenbank zu lesen, um zu sehen, ob der Benutzername bereits vergeben ist?Überprüfen Sie die Firebase-Datenbank, wenn der Benutzername bereits verwendet wird

FIRAuth.auth()?.createUser(withEmail: email!, password: password!) { (user, error) in 
    if error?._code == (FIRAuthErrorCode.errorCodeInvalidEmail.rawValue) 
    { 
     var ref: FIRDatabaseReference! 
     ref = FIRDatabase.database().reference() 
     ref.child("Users").observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in 

      if snapshot.hasChild(name!){ 
       ref.child("users").child((user?.uid)!).setValue(["username": name]) 
       print("true rooms exist") 
      } else { 
       self.displayMyAlertMessage(userMessage: "Username already in use. Please choose another.") 
       print("false room doesn't exist") 
      } 
     }) 
    } else { 
     self.displayMyAlertMessage(userMessage: "Email already in use. Please see the login page.") 
     return 
    } 
} 
+0

hmm ist das nicht "so einfach wie" das Schreiben Ihres Datenbank-Backends? Sie beziehen sich auf die "Datenbank", welche? Haben Sie einen Code für einen permanenten Speicher? – Yohst

+0

Ich benutze Firebase, also ist die Datenbank schon da. Der Code für den Speicher ist die Ref.child-Art des Codes. – AlexGarlock

+0

Dies wurde "ein paar Mal" vorher gefragt. Siehe [diese Antworten] (http://stackoverflow.com/search?q=%5Bfirebase-database%5D%5Bios%5D+unique+username) oder die [ursprüngliche Antwort von Kato] (http://stackoverflow.com/ Fragen/25294478/how-do-you-verhindern-duplicate-user-properties-in-firebase (für JavaScript, aber die Logik ist für alle Plattformen die gleiche). –

Antwort

1

Das, was Sie tun können, ist ein weiteres Kind zB „takenUsernames“ zu erstellen, speichern Sie alle dort Benutzernamen. Und so können Sie überprüfen, ob der Benutzer genommen wurde oder nicht, auch wenn der Benutzer nicht authentifiziert wurde. Sie müssen Regel auch in die Datenbank hinzufügen.

Datenbank-Regeln:

"takenUsernames": { 
     ".read": true, 
     ".write": "auth != null", 
     "$username": { 
     ".validate": "!root.child('takenUsernames').hasChild($username)" 
     } 
     } 

Und in Swift Sie wie dies tun können, wo username Wert von Textfield ist. Es dauert im Grunde nur den Benutzernamen und prüft, ob diese vorhanden ist oder nicht in der takenUsername Kind:

let usernamesRef = FIRDatabase.database().reference().child("takenUsernames") 
       usernamesRef.child(username).observeSingleEvent(of: .value, with: { (snapshot) in 
        if snapshot.exists() { 
         //Username is already taken 
        } else { 
         //Username doesn't exist, do your stuff 
} 

Nun jedes Mal, wenn Sie Benutzer registrieren, musst du Schlüsselwertpaar in das takenUsernames Kind hinzuzufügen. In meinem Fall mache ich es so:

usernamesRef.updateChildValues([username:uid]) 

Ich hoffe, Sie bekommen die Idee.

+0

Ich denke, dass die Sicherheitsregeln einige Sicherheitsfunktionen benötigen. Mit der aktuellen Sicherheitseinstellung kann ein Benutzer möglicherweise andere Benutzernamen als seine eigenen überschreiben. –

+0

Ich habe die Idee. Speichern Sie die Benutzernamen in zwei Punkten ziemlich. Nicht sicher, wie ein Benutzer andere Benutzernamen überschreiben kann, wenn Sie überprüfen, ob dieser Benutzername existiert. Fühle mich, als wäre ich jetzt wie eine Playstation und lass die User ihren Benutzernamen nicht ändern. LOL – AlexGarlock

+0

Was ist, wenn wir dies erreichen wollen, bevor ein Benutzer authentifiziert wird? – waseefakhtar

Verwandte Themen