Hola, estoy tratando de usar la biblioteca bcriptjs para comparar la contraseña cifrada con la contraseña de la base de datos.
Estoy usando el método "comparar".
Los valores que le agrego al método son:
- Primero, la contraseña que me da el usuario. ( contraseña )
- En segundo lugar, la contraseña cifrada de la base de datos. ( pasar_db )
Pero siempre devuelve falso
const bcrypt = require('bcryptjs') const create = (req, res) => { const { email, password } = req.body; if (password.length < 6) { res.send({ msgType: "error", msg: "Contraseña almenos 6 caracteres" }); } else { const hash = bcrypt.hashSync(password, 6); db.query( "INSERT INTO users (email, password) VALUES (?,?)", [email, hash], (err) => { res.send({ msgType: "success", msg: "Usuario creado correctamente" }); } ); } }; //TODO Login dont work always return false const login = (req, res) => { //Password from req.body const { email, password } = req.body; db.query( "SELECT password FROM users WHERE email = ?", [email], (err, result) => { // Password encrypted from database pass_db = result[0].password; if(err){ res.send({msgType:'error', msg:'Incorrect Login'}) } if(result.length > 0){ //Compare password from req.body with password encryted from database const validate = bcrypt.compareSync(password, pass_db); //Always false console.log(validate); if(validate){ res.send({msgType:'success', msg: "Correct login" }) }else{ res.send({msgType:'error', msg: "Incorrect email or password" }); } }else{ res.send({msgType:'error', msg: "Incorrect email or password" }); } } ); };También probé este código pero no funcionó.
bcrypt.hash(password, 6, function (err, hash) { if (err) { throw err; } bcrypt.compare(pass_db, hash, function (err, result) { if (err) { throw err; } console.log(result); }); });Espero que me puedan ayudar con este problema, gracias.
Siempre que la contraseña almacenada en la base de datos se recupere correctamente, debería funcionar. Simplifiqué el programa para no usar una base de datos (solo un objeto local para almacenar la contraseña codificada) y funciona bien. Como estoy usando los mismos comandos bcrypt que usted, lo único que puedo imaginar es que hay un problema con la contraseña cifrada que no regresa de la base de datos correctamente. Intente imprimir el valor hash durante la create y nuevamente después de recuperarlo de la base de datos y confirme que coincidan. Si pass_db no es exactamente lo que debería ser, eso explicaría por qué no puede comparar con éxito. ¿Está seguro de que el result[0] que regresa de db.query es un objeto JSON que tiene un atributo de password ?
Aquí está mi versión simplificada del código que funciona sin usar la base de datos:
const bcrypt = require('bcryptjs') const passwords = {}; const create = async (email, password) => { if (password.length < 6) { console.log("Password must be at least 6 characters"); } else { const hash = bcrypt.hashSync(password, 6); passwords[email] = hash; // Store the hash in the passwords instead of db } }; const login = (email, password) => { const pass_db = passwords[email]; // Retrieve hash from passwords instead of db if (pass_db) { const validate = bcrypt.compareSync(password, pass_db); if (validate) { console.log('Correct login'); } else { console.log('Incorrect email or password'); } } else { console.log('Incorrect email or password'); } }; const email = 'abc@mail.com'; const pw = 'testpass12345'; create(email, pw); console.log('Try the right password'); login(email, pw); console.log('Try the wrong password'); login(email, 'wrongpw'); console.log('Try the wrong email'); login('unknown@abc.com', 'blah');Ejecutar este programa da el siguiente resultado:
Try the right password Correct login Try the wrong password Incorrect email or password Try the wrong email Incorrect email or password