gpt4 book ai didi

node.js - 带有 Passport 的 Express Flash 消息不起作用

转载 作者:搜寻专家 更新时间:2023-10-31 23:42:30 25 4
gpt4 key购买 nike

按照示例https://scotch.io/tutorials/easy-node-authentication-setup-and-local我已经创建了一个简单的注册应用程序来测试 Passport 。

我正在使用 Express 4 和连接闪存模块。

我的路线如下,即在 GET/signup 上我显示带有任何可能的 signupMessage flash 消息(始终未定义)的注册表单。在 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
}));

接下来是我的 Passport 相关代码。它有效,但像 return done(null, false, req.flash('signupMessage', 'That email is already taken.')); 似乎 must set the request flash message 似乎不起作用因为 Flash 消息永远不会显示在 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') });
});

但这行不通。

谁能帮帮我?

谢谢。

最佳答案

对于可能遇到类似问题的任何人,我发现我的错误是在 session 配置中。

如文档所示,如果您设置了安全 cookie 选项,则您的连接必须通过 HTTPS,否则将不会创建 cookie。这就是普通消息和 Flash 消息都不起作用的原因。

关于node.js - 带有 Passport 的 Express Flash 消息不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29310650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com