我已经看过如何错误处理应该在节点通过
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 举报,一经查实,本站将立刻删除。