无法显示来自 Passport.js 的即显消息
Unable to show flash message from Passport.js
如果身份验证失败,我无法发送闪光灯。除了一切正常。当我将示例 (https://github.com/jaredhanson/connect-flash) 复制到我的应用程序时,闪存消息工作正常...
这是我的代码:
//routes
app.get('/login', function (req,res){
res.render('login', {
authMessage: req.flash('authMessage')
});
});
app.post('/login', passport.authenticate('local', {
failureRedirect: '/login',
failureFlash: true
}), function(req,res){
res.send('ok');
});
//local strategy
passport.use(new LocalStrategy(
function(username, password, authCheckDone) {
UserDetails.findOne({username : username}).then(
function(user){
if (!user) {
console.log('bad username');
return authCheckDone(null, false, {authMessage: 'Wrong name'});
}
if (user.password !== password) {
console.log('bad password');
return authCheckDone(null, false, {authMessage: 'Wrong password'});
}
return authCheckDone(null, user);
}),
function(error){
return authCheckDone(error);
};
}
));
//ejs
<% if (authMessage.length > 0) { %>
<p>test</p>
<%= authMessage %>
<% } %>
我在某处读到过这个问题可能与安全性有关,而不是使用 https,但如果是这样的话,来自 github 的示例也不会起作用...
如果我没记错的话,您传递给 LocalStrategy
的回调应该将请求对象作为第一个参数。所以你的函数看起来像这样:
function(req, username, password, authCheckDone) {
// your code
之后,根据我的例子,你应该 return authCheckDone
的结果如下:
return authCheckDone(null, false, req.flash('authMessage', "your message"));
但请确保按以下方式创建 LocalStrategy
对象:
new LocalStrategy({
passReqToCallback: true // don't forget this
}, function(req, username, password, authCheckDone) {
如果身份验证失败,我无法发送闪光灯。除了一切正常。当我将示例 (https://github.com/jaredhanson/connect-flash) 复制到我的应用程序时,闪存消息工作正常...
这是我的代码:
//routes
app.get('/login', function (req,res){
res.render('login', {
authMessage: req.flash('authMessage')
});
});
app.post('/login', passport.authenticate('local', {
failureRedirect: '/login',
failureFlash: true
}), function(req,res){
res.send('ok');
});
//local strategy
passport.use(new LocalStrategy(
function(username, password, authCheckDone) {
UserDetails.findOne({username : username}).then(
function(user){
if (!user) {
console.log('bad username');
return authCheckDone(null, false, {authMessage: 'Wrong name'});
}
if (user.password !== password) {
console.log('bad password');
return authCheckDone(null, false, {authMessage: 'Wrong password'});
}
return authCheckDone(null, user);
}),
function(error){
return authCheckDone(error);
};
}
));
//ejs
<% if (authMessage.length > 0) { %>
<p>test</p>
<%= authMessage %>
<% } %>
我在某处读到过这个问题可能与安全性有关,而不是使用 https,但如果是这样的话,来自 github 的示例也不会起作用...
如果我没记错的话,您传递给 LocalStrategy
的回调应该将请求对象作为第一个参数。所以你的函数看起来像这样:
function(req, username, password, authCheckDone) {
// your code
之后,根据我的例子,你应该 return authCheckDone
的结果如下:
return authCheckDone(null, false, req.flash('authMessage', "your message"));
但请确保按以下方式创建 LocalStrategy
对象:
new LocalStrategy({
passReqToCallback: true // don't forget this
}, function(req, username, password, authCheckDone) {