我有一个新的Sails.js项目使用Passport.js来验证用户身份。我有基本身份验证工作(意味着用户可以注册并成功登录),但如果他们没有输入正确的凭据,则希望在登录视图中显示相应的错误消息。我无法弄清楚如何在视图中打印任何错误消息。
这是我的设置。我有config/passport.js
,其中包含以下内容:
var passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
bcrypt = require('bcrypt');
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findOne({ id: id } , function (err, user) {
done(err, user);
});
});
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback : true
},
function(req, email, password, done) {
User.findOne({ email: email }, function (err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Please enter a valid email address.' });
}
if (!req.body.username) {
return done(null, false, { message: 'Please enter your username.' });
}
bcrypt.compare(password, user.password, function (err, res) {
if (!res) {
return done(null, false, {
message: 'Invalid Password'
});
}
var returnUser = {
username: user.username,
email: user.email,
createdAt: user.createdAt,
id: user.id
};
return done(null, returnUser, {
message: 'Logged In Successfully'
});
});
});
}
));
然后我有api/controllers/AuthController.js
,其中包含以下内容:
var passport = require('passport');
module.exports = {
_config: {
actions: false,
shortcuts: false,
rest: false
},
login: passport.authenticate('local', { successRedirect: '/',
failureRedirect: '/login',
failureFlash: true
}),
logout: function(req, res) {
req.logout();
res.redirect('/login');
}
};
同样,如果用户填写正确的凭据,这可以正常工作。我正在使用Handlebars作为我的模板引擎,并希望在登录视图中显示错误消息,如下所示:
<div class="alert">{{ message }}</div>
到目前为止,我已尝试{{ failureMessage }}
{{ message }}
{{ req.flash.failureMessage }}
{{ req.flash.err }}
{{ req.flash.message }}
无济于事。所以这一切,我如何在我的视图中显示相应的错误消息?更好的是,我如何在我的视图中突出显示错误字段?
答案 0 :(得分:2)
乍一看,看起来像帆正在使用Express 3.0。根据Passport文档(http://passportjs.org/docs),您需要明确添加中间件以支持Flash(他们建议使用https://github.com/jaredhanson/connect-flash)。
答案 1 :(得分:1)
不知道这是否对你有帮助,布拉德。
https://stackoverflow.com/a/25151855/3499069
我认为在serializeUser
电话中你需要它user[0].id
,但我最近离开了Passport,所以我错了。
答案 2 :(得分:0)
在我看来,你没有包括快速闪光灯?
var flash = require('connect-flash');
app.use(flash());
在路由器中添加
req.flash(type, message);
并使用
var t = req.flash(type);
res.render(view, {flashMessage: t});