微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Express Passport(node.js)错误处理

我已经看过如何错误处理应该在节点通过 this stack exchange工作,但我不知道什么护照做失败认证时。我有以下LocalStrategy:

passport.use(new LocalStrategy({ usernameField: 'email',passwordField: 'password' },function(email,password,next) {

    User.find({email: UemOrUnm},function(err,user){
      if (err) { console.log('Error > some err'); return next(err); }
      if (!user) { console.log('Error > no user'); return next('Incorrect login or password'); } 

      if (password != user.password) {
        return next(Incorrect login or password);
      }
      return next(null,user);
    });
  }
));

我看到“错误>一些错误的控制台打印输出,没有别的发生。我认为它应该继续在下一个路径与一个错误参数,但它似乎没有这样做。这是怎么回事?

解决方法

策略实现与passport.authenticate结合使用,以验证请求,并处理成功/失败。

假设您使用此路线(传送电子邮件地址和密码):

app.post('/login',passport.authenticate('local',{
  successRedirect: '/loggedin',failureRedirect: '/login',// see text
  failureFlash: true // optional,see text as well
});

这将调用策略中的代码,其中三个条件之一可能发生:

>尝试获取用户的信息时发生内部错误(例如数据库连接已断开);这个错误将被传递:next(err);这将由Express处理并生成HTTP 500响应;
>提供的凭据无效(没有提供电子邮件地址的用户,或密码不匹配);在这种情况下,您不会生成错误,但您传递一个false作为用户对象:next(null,false);这将触发failureRedirect(如果你没有定义一个,将生成HTTP 401未授权响应);
>所有检出,你有一个有效的用户对象,所以你传递它:next(null,user);这将触发successRedirect;

在认证无效(但不是内部错误)的情况下,您可以与回调一起传递额外的消息:

next(null,false,{ message : 'invalid e-mail address or password' });

如果已使用failureFlash并安装了the connect-flash middleware,则提供的消息将存储在会话中,并且可以轻松访问,例如在模板中使用。

编辑:也可以自己完全处理认证过程的结果(而不是Passport发送重定向或401):

app.post('/login',function(req,res,next) {
  passport.authenticate('local',user,info) {
    if (err) {
      return next(err); // will generate a 500 error
    }
    // Generate a JSON response reflecting authentication status
    if (! user) {
      return res.send({ success : false,message : 'authentication Failed' });
    }
    // ***********************************************************************
    // "Note that when using a custom callback,it becomes the application's
    // responsibility to establish a session (by calling req.login()) and send
    // a response."
    // Source: http://passportjs.org/docs
    // ***********************************************************************
    req.login(user,loginErr => {
      if (loginErr) {
        return next(loginErr);
      }
      return res.send({ success : true,message : 'authentication succeeded' });
    });      
  })(req,next);
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐