passport.js - 401 错误后访问失败消息

passport.js - Access fail message after 401 error

目前,我可以通过 req.authInfo 访问 done(null, user, {message: 'ok'}) 中 post 请求中设置的消息,如下所示:

app.post('/reg', passport.authenticate('local-reg', { session: false }), function (req, res) {        
        console.log(req.authInfo.message); --> 'ok'         
});

非常有用。
但是我如何以相同的方式访问这样的消息 done(null, false, {message: 'username taken'}),因为似乎在 passport.authenticate 中传递 done(null, false) 会使它抛出 401 unathorised,因此不会转发到路由处理程序本身。
也许我误解了什么?

P.S.: 我正在 post 通过 jQuery.post.

每个人都有自己的实现方式。在我的实现中,如果没有错误并且登录成功,则:

return done(null, {type : true, data: {email: <some email>, role : <some role>, name: <some name>}, token : <some token>});

而如果出现任何错误或登录不成功,我会做任何一个

return done(null, {type : false, data: 'Email is already taken.'});

return done(null,{type:false, data: err}) 

所以这使我的工作更简单,我只检查 type 值,我可以用它来传递值和错误消息。

您应该在可以访问 info 的地方使用 custom callback

app.post('/req', function(req, res, next) {
  passport.authenticate('local-reg', {session: false}, function(err, user, info) {
    if (err) {
      return next(err);
    }
    if (!user) {
      return res.json(info);
    }
    req.logIn(user, function(err) {
      if (err) {
        return next(err);
      }
      return res.json(info);
    });
  })(req, res, next);
});

req.authInfo 仅在成功登录后设置。如果您使用的是会话,则可以使用带有重定向的 Flash 消息,例如:

app.post('/reg', passport.authenticate('local-reg', {
  successRedirect: '/',
  failureRedirect: '/',
  failureFlash: true,
  successFlash: true
}));

app.get('/', function(req, res) {
  res.json(req.flash());
});