/ / Los mensajes flash rápidos con pasaporte no funcionan - node.js, express, passport.js

Los mensajes flash rápidos con pasaporte no funcionan: node.js, express, passport.js

Siguiendo la muestra https://scotch.io/tutorials/easy-node-authentication-setup-and-local He creado una aplicación de registro simple para probar el pasaporte.

Estoy usando Express 4 y el módulo de conexión de flash.

Mis rutas son las siguientes, eso está en GET /signup Os muestro el formulario de registro con cualquier posible. signupMessage Mensaje flash (siempre indefinido). En POST /signup Intento autenticar credenciales:

router.get("/signup", function(req, res) {
debug("GET signup flash message "%s"",req.flash("signupMessage"));
res.render("signup",  { message: req.flash("signupMessage") });
});

// process the signup form
router.post("/signup", passport.authenticate("local-signup", {
successRedirect : "/profile", // redirect to the secure profile section
failureRedirect : "/signup", // redirect back to the signup page if there is an error
failureFlash : true // allow flash messages
}));

Mi código relacionado con el pasaporte es el siguiente. Funciona pero las líneas como return done(null, false, req.flash("signupMessage", "That email is already taken.")); Parece que debe establecerse el mensaje flash de solicitud parece no funcionar porque el mensaje flash nunca se muestra en el formulario de registro mostrado por el método GET.

passport.use("local-signup", new LocalStrategy({
// by default, local strategy uses username and password, we will override with email
usernameField : "email",
passwordField : "password",
passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, email, password, done) {

debug("Auth");

// asynchronous
// User.findOne wont fire unless data is sent back
process.nextTick(function() {

debug("before findOne");

// find a user whose email is the same as the forms email
// we are checking to see if the user trying to login already exists
User.findOne({ "local.email" :  email }, function(err, user) {

debug("inside findOne");

// if there are any errors, return the error
if (err) {
return done(err);
}

// check to see if theres already a user with that email
if (user) {
debug("user exists");
return done(null, false, req.flash("signupMessage", "That email is already taken."));
} else {

debug("creating new user");

// if there is no user with that email
// create the user
var newUser            = new User();

// set the user"s local credentials
newUser.local.email    = email;
newUser.local.password = newUser.generateHash(password);

// save the user
newUser.save(function(err) {
if (err) {
throw err;
}
return done(null, newUser);
});
}

});

});

}));

Después de buscar ayuda también trato de poner:

return done(null, false, {message: "That email is already taken."});

y en el GET /signup método de uso:

router.get("/signup", function(req, res) {
res.render("signup",  { message: req.flash("error") });
});

pero eso no funciona.

¿Alguien me puede ayudar?

Gracias.

Respuestas

4 para la respuesta № 1

Para cualquier persona que pueda tener un problema similar, encontré que mi error estaba en la configuración de las sesiones.

Como indica docs, si configura la opción de cookie segura, su conexión debe ser a través de HTTPS o la cookie no se creará. Esa fue la razón por la que los mensajes normales y flash no funcionan.


0 para la respuesta № 2
var session = require("express-session");
var flash = require("express-flash");
var cookieParser = require("cookie-parser");
app.use(cookieParser());
app.use(session({
secret: config.sessionKey,
resave: true,
saveUninitialized: true,
}));
app.use(flash());