Следва извадката 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());