Estoy tratando de configurar una estrategia local y usar failureMessages de error que muestran errores de autenticación al usuario, pero no estoy seguro de cuál es la forma correcta de hacerlo.
Los mensajes de falla se agregan a los mensajes de req.session.messages cada vez que ocurre una falla, pero los mensajes de sesión nunca se borran. Aquí está el resultado:
Obviamente, el último mensaje es el más reciente, pero ¿cómo sé si los mensajes son de una falla actual o de una que ocurrió en el pasado porque solo quiero mostrar un mensaje de error si es una falla actual?
autenticación.js
passport.use(new LocalStrategy( function(username, password, done) { myDatabase.findOne({ username: username }, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Incorrect username or password.' }); } if (!bcrypt.compareSync(password, user.password)) { return done(null, false, { message: 'Incorrect username or password.' }); } return done(null, user); }); } ));rutas.js
app.route('/login').post(passport.authenticate('local', { failureRedirect: '/', failureMessage: true }), (req, res) => { res.redirect('/profile'); });servidor.js
app.use(session({ secret: process.env.SESSION_SECRET, resave: true, saveUninitialized: true, cookie: { secure: false }, key: 'express.sid', store: store })); app.use(passport.initialize()); app.use(passport.session());Pude borrar los req.session.messages antes de enviar un nuevo mensaje de falla al configurar la opción passReqToCallback . De esta forma sabemos que cualquier mensaje contenido en req.session.messages es un nuevo fallo.
passport.use(new LocalStrategy({ passReqToCallback: true }, function(req, username, password, done) { myDatabase.findOne({ username: username }, function(err, user) { if (err) { return done(err); } if (!user) { req.session.messages = []; return done(null, false, { message: 'Incorrect username or password.' }); } if (!bcrypt.compareSync(password, user.password)) { return done(null, false, { message: 'Incorrect username or password.' }); } return done(null, user); }); } ));