如何向用户显示 Passport.js 失败消息
How to display Passport.js failure messages to the user
我正在尝试设置本地策略并使用 failureMessages
向用户显示身份验证错误,但我不确定执行此操作的正确方法。
每次发生故障时都会将故障消息添加到 req.session.messages
,但永远不会清除 session.messages。这是结果:
显然,最后一条消息是最新的,但是我怎么知道这些消息是来自当前故障还是过去发生的故障,因为我只想显示当前故障消息失败。
auth.js
passport.use(new LocalStrategy(
function(username, password, done) {
myDatabase.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false, { message: 'Incorrect username or password.' }); }
if (!bcrypt.compareSync(password, user.password)) {
return done(null, false, { message: 'Incorrect username or password.' });
}
return done(null, user);
});
}
));
routes.js
app.route('/login').post(passport.authenticate('local', { failureRedirect: '/', failureMessage: true }),
(req, res) => {
res.redirect('/profile');
});
server.js
app.use(session({
secret: process.env.SESSION_SECRET,
resave: true,
saveUninitialized: true,
cookie: { secure: false },
key: 'express.sid',
store: store
}));
app.use(passport.initialize());
app.use(passport.session());
通过设置 passReqToCallback
选项,我能够在发送新的 failureMessage 之前清除 req.session.messages
。这样我们就知道 req.session.messages 中包含的任何消息都是新的失败。
passport.use(new LocalStrategy({ passReqToCallback: true },
function(req, username, password, done) {
myDatabase.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
req.session.messages = [];
return done(null, false, { message: 'Incorrect username or password.' }); }
if (!bcrypt.compareSync(password, user.password)) {
return done(null, false, { message: 'Incorrect username or password.' });
}
return done(null, user);
});
}
));
我正在尝试设置本地策略并使用 failureMessages
向用户显示身份验证错误,但我不确定执行此操作的正确方法。
每次发生故障时都会将故障消息添加到 req.session.messages
,但永远不会清除 session.messages。这是结果:
显然,最后一条消息是最新的,但是我怎么知道这些消息是来自当前故障还是过去发生的故障,因为我只想显示当前故障消息失败。
auth.js
passport.use(new LocalStrategy(
function(username, password, done) {
myDatabase.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false, { message: 'Incorrect username or password.' }); }
if (!bcrypt.compareSync(password, user.password)) {
return done(null, false, { message: 'Incorrect username or password.' });
}
return done(null, user);
});
}
));
routes.js
app.route('/login').post(passport.authenticate('local', { failureRedirect: '/', failureMessage: true }),
(req, res) => {
res.redirect('/profile');
});
server.js
app.use(session({
secret: process.env.SESSION_SECRET,
resave: true,
saveUninitialized: true,
cookie: { secure: false },
key: 'express.sid',
store: store
}));
app.use(passport.initialize());
app.use(passport.session());
通过设置 passReqToCallback
选项,我能够在发送新的 failureMessage 之前清除 req.session.messages
。这样我们就知道 req.session.messages 中包含的任何消息都是新的失败。
passport.use(new LocalStrategy({ passReqToCallback: true },
function(req, username, password, done) {
myDatabase.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
req.session.messages = [];
return done(null, false, { message: 'Incorrect username or password.' }); }
if (!bcrypt.compareSync(password, user.password)) {
return done(null, false, { message: 'Incorrect username or password.' });
}
return done(null, user);
});
}
));