如何向用户显示 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);
      });
    }
  ));