Estoy usando pasaporte con pasaporte-local-mangoose para registrar e iniciar sesión de usuarios.
Este es el código que uso para iniciar sesión de usuarios:
passport.use(new localStrategy({ usernameField: 'email' }, function(email, password, done) { User.findOne({ email: email }, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Incorrect username or password.' }); } if (!user.validPassword(password)) { return done(null, false, { message: 'Incorrect username or password.' }); } return done(null, user); }); }));Todo funciona divertido pero user.validPassword. Lo defino en el modelo de usuario:
userSchema.methods.validPassword = function(password) { // What should I write here? };Dado que la contraseña hash se guardará en la base de datos, no sé cómo validar la contraseña.
Por ejemplo, este es un usuario guardado en la base de datos{
"_id" : ObjectId("5901d55c30967512407cdcd0"), "salt" : "7e76e1de50856c0a0e219c48609e0c86e8036bd4aa48e5161635f88dd19b695b", "hash" : "", "username" : "stve45", "email" : "stebe@companycom", "name" : "Steve", "__v" : 0 }También uso pasaporte-local-autenticación simple.
Cualquier ayuda será apreciada, muchas gracias.
Si está utilizando pasaporte-local-mangoose, creará una sal y un hash al tomar su contraseña. Es por eso que en su esquema de usuario no tiene que guardar el campo de contraseña.
Pero la estrategia local para pasaporte-local-mangosta es bastante diferente de la estrategia local de pasaporte normal. Es como
passport.use(new LocalStrategy(User.authenticate()));Esto verificará la contraseña ingresada y la verificará con la sal y el hash.
El código que escribió es para la estrategia local normal. Eso no debería usarse si está usando pasaporte-local-mangoose.
Así es como debe srializar y desirializar pasaporte-local-mangoose:
passport.serializeUser(User.serializeUser());passport.deserializeUser(User.deserializeUser());Supongo que tiene un método para generar la sal y el hash antes de guardar.
En su método validPassword, llama al mismo método y compara el resultado de la entrada de la contraseña del usuario y lo compara con lo que tiene en la base de datos. Si coincide, entonces está bien.
Como alternativa, existen bibliotecas para gestionar esto. Yo uso bcrypt . Vea una muestra aquí:
adminSchema.pre('save', function(next) { var user = this; // only hash the password if it has been modified (or is new) if (!user.isModified('password')) { return next(); } // password changed so we need to hash it (generate a salt) bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) { if (err) { return next(err); }else{ // hash the password using our new salt bcrypt.hash(user.password, salt, function(err, hash) { if (err) { return next(err); } // override the cleartext password with the hashed one user.password = hash; next(); }); } }); }); adminSchema.methods.comparePassword = function(password, cb) { console.log('comparing password'); bcrypt.compare(password, this.password, function(err, isMatch) { cb(err, isMatch); }); };Aquí hay un código de ejemplo. Tenga en cuenta que la función User.findOne() está lejos de estar completa. Está ahí solo para que vea dónde se encuentra este código con respecto al suyo y para darle una idea de los cambios que se deben realizar.
passport.use('local.signup', new LocalStrategy({ usernameField:'email', //it can be email or whatever one chooses passwordField:'password', confirmField:'password', passReqToCallback:true//here is the trick.u pass everything you want to do to a callback },function (req,email, password, done) { req.checkBody('email','Invalid e-mail address...').notEmpty().isEmail().normalizeEmail();//validate email req.checkBody('password','Invalid password...').notEmpty().isLength({min:8});//validate pass to be min 8 chars but you can provide it with checking for capital letters and so on and so forth var errors = req.validationErrors(); if(errors){ var messages = []; errors.forEach(function (error) { messages.push(error.msg) }); return done(null, false, req.flash('error', messages)) } User.findOne({ email: req.body.email }, function (err, user) { // Make sure user doesn't already exist if (user) return done(null, false, {message:'The email address you have entered is already associated with another account.' });