2016-03-29 5 views
1

Ich habe verschiedene ähnliche Fragen hier durchgemacht und ich habe sie alle ausprobiert, aber trotzdem ist das Ergebnis immer "falsches Passwort".Knoten js - Bcrypt - Vergleichsmethode gibt false für das korrekte Eingabe-Passwort zurück

Ich benutze bcrypt für nodejs und meine Passwort-Hashes werden in einer Postgresql-Datenbank gespeichert.

Die hash und compare Methoden sind wie folgt:

generateHash : function(password, callBack){ 

    bcrypt.genSalt(8, function(err, salt) { 

     bcrypt.hash(password, salt, callBack); 
    }); 
} 

validPassword : function(password, callBack){ 

    bcrypt.compare(password, this.password, callBack); 
} 

ich diese Funktion in dem folgenden Code ein:

//Generating hashing and DB storing 
User.generateHash(password, function(err, hash) { 

    // if there is no user with that email 
    // create the user 
    var newUser = User.build({ 

     email: email, 
     password: hash 
     }) 
     .save() 
     .then(function(newUser) { 

      return done(null, newUser); 
     }) 
     .catch(function(err){ 

      return done(err, false); 
     }); 
    }); 

//... 
//Checking the password input for login 

user.validPassword(password, function(err, res) { 

    if(err) throw err; 

    if(!res){ 

     return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); 
    } 
    else{ 

     // all is well, return successful user 
     return done(null, user); 
    } 
}); 

Ich hoffe, das war klar. Danke im Voraus. Ciao.

Aktualisierung I:callBack hinzugefügt zu , obwohl dies das Problem nicht behoben hat. Und ich habe auch den Wert überprüft, es ist korrekt und wie erwartet. Also, das Problem ist immer noch vorhanden.

+0

Könnten Sie einen Beispiel-'this.password'-Wert veröffentlichen, damit ich sehen kann, ob es tatsächlich ein gültiger bcrypt-Hash ist? Welches bcrypt Modul verwendest du? Und es könnte nützlich sein, hinzuzufügen, wo die Funktionen 'validPassword' und 'generateHash' definiert sind. (wie es scheint, sind sie Eigenschaften eines Objekts wegen der Art, wie Sie sie definieren) – leroydev

Antwort

1

Ich habe gerade das Problem gelöst. Es war eine Reihe von Fehlern, die es schwierig machten, es herauszufinden. Also werde ich nur aufzuzählen, was solche Dinge zu vermeiden, muss getan werden:

  1. Die hash muss als varchar und nicht als char in der Datenbank gespeichert werden. Der letzte Grund dafür ist, dass der Hash eine falsche Länge hat und der Vergleich fehlschlägt. varchar ist die Lösung dafür.
  2. Die Verarbeitung des Vergleichsergebnisses muss innerhalb der CallBack-Funktion erfolgen. Dies liegt daran, dass nodejs asynchron ist. Das war richtig (siehe Code in der Frage) Ich möchte nur darauf hinweisen. Andernfalls wäre das Ergebnis des Vergleichs undefined.

Ich hoffe, dass dies einigen von Ihnen helfen wird.

1

Ich glaube, Sie callBack als Parameter

validPassword : function(password){

Versuchen hinzuzufügen vergessen, wenn das Hinzufügen Ihr Problem löst, so ändern Sie es in

validPassword : function(password, callBack){

Auch weiß ich nicht wissen, wo Ihre validPassword Funktion ist, aber Sie möchten überprüfen, ob this.password tatsächlich auf das Benutzerkennwort verweist.

+0

Vielen Dank für Ihre Antwort. Ich fügte das callBack hinzu und überprüfte auch den Wert von this.password, das späteste ist korrekt und das callBack reparierte das pro ... irgendwelche Gedanken? – PicoYou

+0

Hallo nochmal @leroydev, this.password enthält einen Hash, aber die Frage ist, ist es der richtige Hash, der in der DB gespeichert wurde? wie kann ich es wissen? – PicoYou

+0

@PicoYou Wenn es ein Hash ist, wird es höchstwahrscheinlich der richtige Hash sein. Sie könnten pgAdmin oder etwas Ähnliches öffnen und prüfen, ob 'this.password' mit der Spalte' password' für den bestimmten Benutzer in der Datenbank übereinstimmt. – leroydev