/ / Expressowe wiadomości flash z paszportem nie działają - node.js, express, passport.js

Ekspresowe wiadomości flash z paszportem nie działają - node.js, express, passport.js

Śledzenie próbki https://scotch.io/tutorials/easy-node-authentication-setup-and-local Utworzyłem prostą aplikację do rejestracji paszportu.

Używam Express 4 i moduł Connect-Flash.

Moje trasy są następujące, to znaczy włączone GET /signup Wyświetlam formularz rejestracji z wszelkimi możliwymi signupMessage komunikat flash (zawsze niezdefiniowany). Na POST /signup Próbuję uwierzytelnić poświadczenia:

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
}));

Mój kod związany z paszportem to miejsce obok. Działa, ale linie jak return done(null, false, req.flash("signupMessage", "That email is already taken.")); wydaje się, że należy ustawić żądanie komunikat flash wydaje się nie działać, ponieważ komunikat flash nigdy nie jest wyświetlany w formularzu rejestracji pokazanym metodą 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);
});
}

});

});

}));

Po szukaniu pomocy staram się również umieścić:

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

i w GET /signup zastosowanie metody:

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

ale to nie działa.

Ktoś może mi pomóc?

Dzięki.

Odpowiedzi:

4 dla odpowiedzi № 1

Dla każdego, kto może mieć podobny problem, mój błąd polegał na konfiguracji sesji.

Jak wskazują dokumenty, jeśli ustawisz opcję bezpiecznego pliku cookie, połączenie musi być realizowane przez HTTPS, inaczej plik cookie nie zostanie utworzony. To był powód, dla którego zwykłe i flashowe wiadomości nie działają.


0 dla odpowiedzi nr 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());