Estoy creando una aplicación y tengo problemas con la actualización de la contraseña con el pasaporte y MongoDB. Quiero verificar si el usuario ha ingresado su contraseña real y coincide con lo que está almacenado en la base de datos antes de configurar una nueva.
Esto es lo que tengo hasta ahora:
if (req.body.password == req.user.password) { if (req.body.newPassword.normalize() == req.body.confirmPassword.normalize()) { // Verifying if the new password matches the confirmation one // before actually changing the password (This part works) } } else { // Handling if the old password does not match the DB } res.redirect('/profile')He estado intentando cosas como:
passport.use(new LocalStrategy( function(username, password, done) { User.findOne({ username: req.user.email }, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false); } if (!user.verifyPassword(req.body.password)) { return done(null, false); } return done(null, user); }); }Aún así, no funciona... ¿Alguna pista? :)
EDITAR
He estado usando crypto en un intento de obtener el mismo hash que el almacenado en MongoDB. Para registrar un nuevo usuario, uso pasaporte.
let hash = crypto.createHmac('sha256', secret) .update('I love cupcakes') // I have no idea of what this this line does, actually... .digest('hex'); console.log(hash);Supongo que en algún momento debería pasar la sal almacenada en DB a una función para verificar que la contraseña que envió sea la misma que la almacenada, simplemente no tengo idea de cómo hacerlo ...
Intente codificar el req.body.password recibido usando el secreto y ver si coincide con la contraseña ya codificada guardada en la base de datos. Si lo hace, es la misma contraseña anterior.
Después de mucho buscar en Internet, se me ocurrió esto:
async function fooChangePW(req,res){ req.user.changePassword(req.body.password, req.body.newPassword) .then(() => { console.log('password changed'); }) .catch((error) => { console.log(error); }) res.redirect('/profile') } Dado que el usuario ya está autenticado, puede ir con req.user.changePassword(oldPassword, newPassword) .