2017-05-19 5 views
-1

J'utilise knex pour sélectionner un mot de passe d'utilisateur spécifique dans ma base de données. ce mot de passe est haché retourné à moi dans un objet comme celui-ci:bcrypt compareSync "Erreur de rejet non gérée: les données et le hachage doivent être des chaînes"

[anonyme { password_hash: '2a $ 10 $ zRSFdNJsg8S3Xv1I73gjYuRu.Mw/9Dtujh0dTqrtc9DA12vUHuqbK'}]

Quand j'essayer d'utiliser bcrypt.compareSync pour comparer le mot de passe entré et le mot de passe qui existe dans la base de données, il me donne une erreur en disant que les données et le hachage doivent être des chaînes. J'ai essayé d'utiliser la méthode .toString() et JSON.stringify (password_hash). Mais les deux ne m'aident pas. Comment puis-je faire fonctionner ça? Toute aide est la bienvenue. Je vous remercie.

Voici mon code:

knex('users').where({ 
    email: req.body.loginEmail 
    }).select('password_hash') 
    .then(function(password_hash) { 
     //console.log("resp", password_hash) 
     console.log("JSON stringifies",JSON.stringify(password_hash)) 
     console.log("req", req.body.loginPass) 
     console.log('hash', password_hash) 
     bcrypt.compareSync(req.body.loginPass, JSON.stringify(password_hash), function(err, doesMatch){ 
     if (doesMatch){ 
     console.log("Passwords Match") 
     req.session.email = rows[0].email; 
     var templateVars = { 
      emale: req.session.email 
     } 
     res.render('/dashboard', templateVars) 
     } else { 
     console.log("THIS IS THE ERROR", err); 
     res.send("I DONT KNOW YOU. SIGN UP FIRSt.") 
     } 
    }) 
    }) 

mon erreur toute

Unhandled rejection Error: data and hash must be strings 
at Object.compareSync (/vagrant/CaloBoxInc/node_modules/bcrypt/bcrypt.js:144:15) 
at /vagrant/CaloBoxInc/server.js:159:14 
at tryCatcher (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/util.js:16:23) 
at Promise._settlePromiseFromHandler (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/promise.js:512:31) 
at Promise._settlePromise (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/promise.js:569:18) 
at Promise._settlePromise0 (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/promise.js:614:10) 
at Promise._settlePromises (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/promise.js:693:18) 
at Async._drainQueue (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/async.js:133:16) 
at Async._drainQueues (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/async.js:143:10) 
at Immediate.Async.drainQueues (/vagrant/CaloBoxInc/node_modules/bluebird/js/release/async.js:17:14) 
at runCallback (timers.js:570:20) 
at tryOnImmediate (timers.js:550:5) 
at processImmediate [as _immediateCallback] (timers.js:529:5) 
+0

Pourriez-vous ajouter un test complet, par exemple avec runkit, qui reproduit votre problème? –

+0

pls, mettez à jour votre question avec le code complet. –

Répondre

0

Se pourrait-il que votre req.body.loginPass n'est pas la chaîne? JSON.stringify renvoie toujours undefined/string et bcrypt renvoie une erreur différente si le paramètre n'est pas défini de sorte que paramater ne peut pas être le problème.

Essayez la force coulée req.body.loginPass à chaîne comme ceci:

bcrypt.compareSync(´´+ req.body.loginPass, ... 

(juste pour des fins de débogage ... mais vous devriez déjà voir des journaux de la console plus tôt qu'il n'est pas une chaîne).

+0

Je l'ai essayé ... toujours la même erreur. Au lieu de rendre, j'ai même essayé de rediriger, mais ce n'est pas non plus utile ... –