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 }); 

这将调用策略中的代码,其中三种情况之一可能发生:

  1. 尝试获取用户信息时发生内部错误(比如数据库连接已经结束); 这个错误将被传递: next(err) ; 这将由Express处理并生成HTTP 500响应;
  2. 提供的凭证无效(没有提供电子邮件地址的用户,或者密码不匹配); 在这种情况下,你不会产生错误,但是你传递一个false作为用户对象: next(null, false) ; 这将触发failureRedirect (如果你没有定义一个,将会产生一个HTTP 401未经授权的响应);
  3. 一切都检查出来,你有一个有效的用户对象,所以你传递它: 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