Unable

2017-06-26 5 views
0

Hallo zusammen, gehashte Passwort zu bestätigen,
Unable

ich meinen Benutzer mit bcrypt Modul am authentifizieren.
Ich bin in der Lage, den Registrierungsprozess durchzuführen, aber vor dem Problem während Login Prozess.
Benutzermodell:

var userSchema = new Schema({ 
    email: {type: String, required: true}, 
    password: {type: String, 
}); 


Hashing Methoden:

userSchema.methods.encryptPassword = function (password) { 
    return bcrypt.hashSync(password, bcrypt.genSaltSync(5), null) 
}; 
userSchema.methods.validPassword = function (password) { 
    return bcrypt.compareSync(password, this.password); 
}; 


Anmelden:

module.exports.login = function (user, callback) { 
    User.findOne({'email': user.email, 'password': user.validPassword(this.password)}, callback); 
}; 


Anmeldung Strecke

router.post('/login', function (req, res) { 
    var user = req.body; 
    User.login(user, function (err, user) { 
     if (err) { 
      throw err; 
     } 
     if (!user) { 
      res.sendStatus(404); 
      return; 
     } 
     res.json(user.id); 
    }); 
}); 


Während der Ausführung ist immer diese Fehlermeldung: Typeerror: user.validPassword ist keine Funktion

Bitte um Hilfe.

Antwort

0

Ihr Fehler ist, dass der Benutzer auf Ihre login Verfahren vorgesehen ist, ist kein Objekt Mongoose DB. Stattdessen sollten Sie Ihre Login-Funktion wie folgt aussehen:

module.exports.login = function (request, callback) { 
    User.findOne({'email': request.email }, function(err, user) { 
     if (err) return callback(err); 
     if(!user || !user.validPassword(request.password)) return callback(); 
     return callback(null, user); 
    }); 
}; 

Dadurch wird sichergestellt, dass user ein gültiges Mongoose Objekt, bevor Sie das Kennwort zu überprüfen versuchen.

Eine andere mögliche Lösung, wenn Sie nicht überprüfen möchten, ob das Kennwort in Ihrer Datenebene gültig ist, besteht darin, das Benutzerdokument einfach anhand seiner E-Mail abzurufen und dann das Kennwort in der Anmelde-Route zu überprüfen.

router.post('/login', function (req, res) { 
    var user = req.body; 
    User.findOne(user, function (err, user) { 
     if (err) { 
      throw err; 
     } 
     if (!user) { 
      res.sendStatus(404); 
      return; 
     } 
     if (!user.validPassword(req.body.password)) { 
      res.sendStatus(401); 
      return; 
     } 
     res.json(user.id); 
    }); 
}); 
+0

Ich möchte die Bedingungen in ** Anmelden ** code.Rather nicht verarbeiten Ich möchte nur eine Mongo-Abfrage ausführen und die Ergebnisse überprüfen die ** Einloggen ** Route. –

+0

Ohne Hashing konnte ich Benutzer anmelden.
'module.exports.login = function (Benutzer, Rückruf) { User.findOne ({'email': user.email, 'password': Benutzer.validPassword (this.Passwort)}, Rückruf); }; ' –

+0

Ich denke, der große Unterschied hier ist, dass durch das Hashing des Passworts (und die Verwendung von' bcrypt', die das Salzen beinhaltet), die Möglichkeit der Abfrage nach einem bestimmten Passwort in Ihrer Datenbank entfällt (eine gute Sache). Mit anderen Worten, 'bcrypt' kann Ihnen nicht sagen, was das richtige" Passwort "(in Ihrer Datenbank) ist, ohne bereits einige Informationen aus der Datenbank zu kennen (das Salz). –

0

In Anmeldung Strecke, müssen Sie das Schema instanziiert:

router.post('/login', function (req, res) { 
    var user = new User(req.body); 
    User.login(user, function (err, user) { 
     if (err) { 
      throw err; 
     } 
     if (!user) { 
      res.sendStatus(404); 
      return; 
     } 
     res.json(user.id); 
    }); 
}); 
+0

Trindale Tavares: Indem ich dies jetzt mache, bekomme ich ** falsche Argumente ** Fehler. –

+0

In welcher Zeile erhalten Sie diesen Fehler? –

+0

'User.findOne ({'email': user.email, 'passwort': user.validPassword (this.password)}, Rückruf);' –