2013-03-29 84 views
55

我已经看过如何通过this stack exchange错误处理应该在节点中工作,但我不确定什么护照在身份验证失败时正在做什么。我有以下LocalStrategy:Express Passport(node.js)错误处理

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

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

回答

135

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

说你正在使用这条路线(这是通过一个电子邮件地址和密码):

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 Unauthorized响应);
  3. 一切都检出,你有一个有效的用户对象,所以你传递它:next(null, user);这将触发successRedirect;

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

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

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

编辑:它也可以完全处理身份验证过程自己的结果(而不是护照发送重定向或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); 
}); 
+2

谢谢!我想在我的情况下,我试图通过ajax发送失败的响应,而不是做重定向。看看护照文档,我认为这意味着我必须使用自定义函数回调来格式化我的路线。 –

+3

如果有帮助,我编辑了我的答案,以显示自己处理身份验证的可能方式:) – robertklep

+1

感谢您的“自己处理身份验证”编辑,这是一种拯救生命! – wulftone

2

您需要添加req.logIn(function (err) { });,做成功重定向内回调函数

+0

你能说清楚你的答案吗? – dgilperez

15

什么基督徒说的话是你需要添加功能

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/

相关问题