2017-09-29 2 views
0

J'implémente l'interface Promise dans mon application avec bcrypt.Bcrypt donne faux lors de la comparaison du mot de passe

Lorsque j'essaie de comparer un mot de passe, j'obtiens une fausse réponse, même si c'est le même mot de passe.

const bcrypt = require('bcrypt'); 
const saltRounds = 10; 
const password = 'secret'; 
const resHash = '' 
/** 
* Generate Password 
*/ 
bcrypt.hash(password, saltRounds).then((res) => { 
    console.log(res) 
    this.resHash = res 
}).catch(err => { 
    console.log(err) 
}) 

/** 
* Compare Password 
*/ 
bcrypt.compare(password, resHash).then((res) => { 
    console.log("Comparison result: " + res) 
}).catch(err => { 
    console.log(err) 
}) 

Je reçois la sortie suivante:

Comparison result: false 
boolean 
$2a$10$n0mnrLHT3rRkREKB8RJXouMFrhNQjqOFeN7Sq.a.BYXigdBhcBkfq 

Toutes les suggestions ce que je fais dans l'exemple ci-dessus ne va pas?

Répondre

1

Si vous exécutez le code ci-dessus comme vous l'avez ici, cela ne fonctionnera pas car la comparaison du mot de passe se déclenche immédiatement et n'attend pas la première promesse de résolution. En outre, vous définissez this.resHash, au lieu de tenter de définir la constante resHash, qui doit être let resHash.

const bcrypt = require('bcrypt'); 
const saltRounds = 10; 
const password = 'secret'; 
let resHash = '' 
/** 
* Generate Password 
*/ 
bcrypt.hash(password, saltRounds).then((res) => { 
    resHash = res; 
    return bcrypt.compare(password, resHash); 
}).then(matches => { 
    console.log('Matches', matches) // true 
}).catch(err => { 
    console.log(err) 
}) 
1

Vous devez d'abord utiliser le sel généré par bcrypt avant de l'appliquer à la méthode de hachage.

const bcrypt = require('bcrypt'); 
const saltRounds = 10; 
const password = 'secret'; 
let resHash = ''; 

bcrypt.genSalt(saltRounds).then(generatedSalt => { 
    bcrypt.hash(password, generatedSalt).then(res => { 
     console.log(res) 
     resHash = res; 
    }).catch(err => { 
     console.log(err); 
    }); 
}).catch(err => { 
    console.log(err); 
}); 

// a promise is async. this will not sequentially be executed 
// to test. use delay 
setTimeout(function() { 
    bcrypt.compare(password, resHash).then(res => { 
     console.log("Comparison result: " + res) 
    }).catch(err => { 
     console.log(err) 
    }); 
}, 2000); 

Vérifiez Bcrypt Github Page pour plus d'informations.

+0

Veuillez ajouter mon code à votre fonction afin qu'il soit complet – mrquad