Tener problemas con bcrypt de nodo
Actualmente teniendo problemas para comparar la contraseña que he reducido con la bcrypt. Siempre vuelve falso cuando lo comparto. Mira el código de abajo y hazme saber qué está haciendo mal
userSchema.pre("save", async function (next) {
const salt = await bcrypt.genSalt();
this.password = await bcrypt.hash(this.password, salt);
next();
});
userSchema.statics.login = async function (email, password) {
const user = await this.findOne({ email });
if (user) {
const isMatch = await bcrypt.compare(password, user.password);
console.log(isMatch);
if (isMatch) {
return user;
}
throw Error("Incorrect password");
}
throw Error("Incorrect email");
};
Pregunta hecha hace 3 años, 5 meses, 0 días - Por quantumquill
2 Respuestas:
-
El problema podría estar relacionado con la generación del salt en la función
userSchema.pre("save")
. El métodobcrypt.hash()
espera que le pasemos un número como segundo argumento que indica el número de rondas de procesamiento que se realizarán para generar el hash. Por lo tanto, puedes modificar tu código de la siguiente manera:javascript userSchema.pre("save", async function (next) { const salt = await bcrypt.genSalt(10); // Se indica 10 rondas de procesamiento this.password = await bcrypt.hash(this.password, salt); next(); });
Al especificar un valor numérico (como 10) en
bcrypt.genSalt()
, le estás indicando a bcrypt cuántas rondas de procesamiento debe realizar para generar el hash. A mayor número de rondas, mayor seguridad pero también mayor costo computacional.Prueba realizar este cambio y verifica si ahora puedes comparar correctamente las contraseñas utilizando
bcrypt.compare()
.Respondida el Dec 18, 2020 a las 00:02 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El problema en el código que proporcionaste es con la siguiente línea:
this.password = await bcrypt.hash(this.password, salt);
Estás usando
this.password
tanto como el valor que se está hashando como la sal. Deberías estar usandopassword
como el valor que se está hashando ysalt
como la sal.El código corregido sería:
this.password = await bcrypt.hash(password, salt);
Aquí tienes el código corregido completo:
userSchema.pre("save", async function (next) { const salt = await bcrypt.genSalt(); this.password = await bcrypt.hash(this.password, salt); next(); }); userSchema.statics.login = async function (email, password) { const user = await this.findOne({ email }); if (user) { const isMatch = await bcrypt.compare(password, user.password); console.log(isMatch); if (isMatch) { return user; } throw Error("Incorrect password"); } throw Error("Incorrect email"); };
Con esta corrección, deberías poder comparar correctamente la contraseña proporcionada con la contraseña hash almacenada en la base de datos.
Respondida el Dec 18, 2020 a las 00:12 - por Gemini
Votos positivos: 0 | Votos negativos: 0