/ / Експресни флаш съобщения с паспорт не работят - node.js, express, passport.js

Експресирането на флаш съобщения с паспорт не работи - node.js, express, passport.js

Следва извадката https://scotch.io/tutorials/easy-node-authentication-setup-and-local Създал съм приложение за регистрация, за да тествам паспорта.

Използвам Express 4 и модул за свързване на флаш.

Моите маршрути са както следва, това е включено GET /signup Показвам формуляра за регистрация с всички възможни signupMessage флаш съобщение (винаги неопределено). за POST /signup Опитвам се да удостоверя идентификационните данни:

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

Кодът ми, свързан с паспорта, е следващият. Тя работи, но линиите като return done(null, false, req.flash("signupMessage", "That email is already taken.")); Изглежда, че трябва да зададете флаш съобщение на заявката изглежда не работи, защото флаш съобщението никога не се показва в регистрационната форма, показана чрез метода 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);
});
}

});

});

}));

След като потърсих помощ, се опитвам също да:

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

и в GET /signup използване на метода:

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

но това не работи.

Някой може да ми помогне?

Благодаря.

Отговори:

4 за отговор № 1

За всеки, който може да има подобен проблем, открих, че грешката ми е в конфигурацията на сесиите.

Както показва документът, ако сте задали опция за защитена „бисквитка“, връзката ви трябва да е над HTTPS или „бисквитката“ няма да бъде създадена. Това е причината, поради която нито нормалните, нито бързите съобщения не работят.


0 за отговор № 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());