2016-11-15 3 views
-1

Ich versuche, Benutzername Eindeutigkeit während der Registrierung Benutzer zu überprüfen. Ich weiß, dass es Tonnen von Fragen darüber gibt und ich ging durch alle von ihnen aber mein Problem ist, dass es nichts tut, es druckt nicht, dass der Benutzername existiert und es sogar nicht mit dem Benutzernamen registriert.Firebase Benutzername Eindeutigkeit in Swift

Was mache ich falsch? Ich kann keine Antwort finden, das Einzige, was falsch sein könnte, ist das, wenn ich niste.

Dies ist die Struktur:

AppName: 
    users 
    1v2mRJTvrBQ7dMQohUU3rnn7ypI3: //UID 
    username: John 

Und das ist der Code:

func registerUser(){ 
     guard let username = usernameField.text, let email = emailField.text, let password = passwordField.text else{ 
      print("Successfully registered") 
      return 
     } 
     if connectedToNetwork() == true{ 
      if passwordField.text == confirmPasswordField.text{ 
       let usersRef = FIRDatabase.database().reference().child("users") 
       usersRef.queryOrdered(byChild: "username").queryEqual(toValue: "\(username)") 
       .observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in 
        if snapshot.value is NSNull{ 

       AuthProvider.Instance.register(withEmail: email, password: password, username: username, loginHandler: { (errMessage) in 
        if errMessage != nil{ 

        }else{ 
         let user = FIRAuth.auth()?.currentUser 
         guard let uid = user?.uid else{ 
          return 
         } 
         user?.sendEmailVerification() { error in 
          if let error = error { 
           print(error.localizedDescription) 
          } else { 
           print("Email has been sent to you!") 
          } 
         } 
         //User logged in and redirect 

        } 
       }) 
        }else{ 
        print("Username already exists")// It doesn't execute this 
        } 
       }) 
      }else{ 
       Util.errorAlert(message: "Passwords do not match!") 
      } 
     }else{ 
      Util.errorAlert(message: "The internet connection appears to be offline.") 
     } 
    } 

ich verschiedene Sicherheitsregeln auch versucht, aber diese sollten keinen Unterschied machen, aber diejenigen, die ich verwendet:

{ 
"rules": { 
".read": "auth != null", 
".write": "auth != null", 
"Snuses": { 
".indexOn": "Brand", 
    "$username": { 
     ".validate": "!root.child(users').hasChild($username)" 
    } 
} 
} 
} 

Was mache ich falsch?

+0

Scheint in Ordnung. Was ist das Problem? Welchen Fehler bekommst du? – GJZ

+0

Nichts, kein Fehler, nur nichts. –

+0

Haben Sie alle öffnenden und schließenden Klammern überprüft? Vielleicht wird ein Teil des Codes nicht ausgeführt. – GJZ

Antwort

1

Ihr Problem in Ihren Sicherheitsregeln ist. Sie führen eine Abfrage durch, bevor der Benutzer authentifiziert wurde. Diese Abfrage schlägt fehl, da Ihre Regeln angeben, dass der Benutzer authentifiziert werden muss, um die Datenbank abzufragen (auth! = Null).

Was Sie tun müssen, ist ein anderes Kind namens "Benutzernamen" zu erstellen. Machen Sie dies für jeden ohne Authentifizierung lesbar. Überprüfen Sie, ob der Benutzername verwendet wird und wenn nicht, fordern Sie ihn für den neuen Benutzer an. Führen Sie dann Ihren Auth-Aufruf aus und erstellen Sie Ihren Benutzer im untergeordneten "Benutzer".

0

Wenn Sie nichts über Firebase wissen, scheint Ihre Art zu "wissend, dass etwas unternommen wird" zu alarmieren oder zu drucken. Wenn es das nicht tut, sehe ich mindestens zwei Ausführungspfade, die nicht in Alarmierung oder Drucken enden.

if errMessage != nil{

guard let uid = user?.uid else{

Auch könnte dies else fehlt, aber ich kann es nicht mit dem Niveau der Aufwand finden ausreichend, um eine Beantwortung S. O. Frage:

if snapshot.value is NSNull{

Rein theoretisch Ihr Util.errorAlert auch gebrochen werden kann.

0

Firebase erlaubt keine doppelten Benutzer (Namen), also suchen Sie einfach nach einem Fehler, wenn Sie versuchen, den Benutzer zu erstellen.

FIRAuth.auth()?.createUser(withEmail: email, password: password) { (user, error) in 
    // ... 
} 

Es gibt 4 Fehler, die zurückgegeben werden könnten:

FIRAuthErrorCodeInvalidEmail 
    Indicates the email address is malformed. 

FIRAuthErrorCodeEmailAlreadyInUse (this is the one to address you question) 
    Indicates the email used to attempt sign up already exists. Call 
    fetchProvidersForEmail to check which sign-in mechanisms such 
    user used, and prompt the user to sign in with one of those. 

FIRAuthErrorCodeOperationNotAllowed 
    Indicates that email and password accounts are not enabled. Enable them in the 
    Authentication section of the Firebase console. 

FIRAuthErrorCodeWeakPassword 
    Indicates an attempt to set a password that is considered too weak. The 
    NSLocalizedFailureReasonErrorKey field in the NSError.userInfo 
    dictionary object will contain more detailed explanation that can 
    be shown to the user. 
+0

Aber es prüft nicht die Nutzername..E-Mail funktioniert, aber ich muss auch den Benutzernamen überprüfen, der in der Firebase-Datenbank gespeichert ist. –

+0

@ TarvoMäeSpp Ist der Benutzername, den Sie in Firebase speichern, derselbe wie der Firebase-Benutzername? Es ist normalerweise dasselbe, aber Sie haben möglicherweise einen anderen Anwendungsfall. Wenn Sie einen Benutzer erstellen, wird dies mit seiner E-Mail-Adresse gemacht und dann über Ihren Code in Ihren Benutzern gespeichert. – Jay

+0

Ich speichere "username": "usernameField.text" in der Firebase-Datenbank unter Benutzer Knoten nach der Registrierung mit einigen anderen Details auch. Was sind dann bessere Regeln? Was meinst du mit firebase Benutzername? –