Express Passport(node.js)error handling
我已经看过error handling如何通过这个堆栈交换在节点中工作,但是我不确定什么护照在authentication失败时正在做什么。 我有以下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); }); } ));
当我看到'错误>一些错误'控制台打印输出,没有其他事情发生。 我认为它应该继续在下一个错误参数的path,但它似乎并没有这样做。 这是怎么回事?
策略实现与passport.authenticate
协同工作。authentication既要validation请求,又要处理成功/失败。
假设您正在使用此路线(通过电子邮件地址和密码):
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
;
如果身份validation无效(但不是内部错误),则可以在callback中传递额外的消息:
next(null, false, { message : 'invalid e-mail address or password' });
如果使用了failureFlash
并安装了连接闪存中间件 ,则所提供的消息将存储在会话中,并且可以轻松访问,例如,可以在模板中使用。
编辑:它也可以完全处理自己的身份validation过程的结果(而不是护照发送redirect或401):
app.post('/login', function(req, res, next) { passport.authenticate('local', function(err, 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, res, next); });
基督徒说的是你需要添加这个function
req.login(user, function(err){ if(err){ return next(err); } return res.send({success:true}); });
所以整个路线是:
app.post('/login', function(req, res, next) { passport.authenticate('local', function(err, user, info) { if (err) { return next(err); // will generate a 500 error } // Generate a JSON response reflecting authentication status if (! user) { return res.send(401,{ success : false, message : 'authentication failed' }); } req.login(user, function(err){ if(err){ return next(err); } return res.send({ success : true, message : 'authentication succeeded' }); }); })(req, res, next); });
来源: http : //passportjs.org/guide/login/
你需要添加req.logIn(function (err) { });
并在callback函数内部成功redirect