策略实施与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 Unauthorized响应);
- 一切都检出,你有一个有效的用户对象,所以你传递它:
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);
});
谢谢!我想在我的情况下,我试图通过ajax发送失败的响应,而不是做重定向。看看护照文档,我认为这意味着我必须使用自定义函数回调来格式化我的路线。 –
如果有帮助,我编辑了我的答案,以显示自己处理身份验证的可能方式:) – robertklep
感谢您的“自己处理身份验证”编辑,这是一种拯救生命! – wulftone