策略实现与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 响应;
- 提供的凭据无效(没有提供的电子邮件地址的用户,或密码不匹配);在这种情况下,您不会产生错误,但您将 a
false
作为用户对象传递next(null, false)
:这将触发failureRedirect
(如果您没有定义,则会生成 HTTP 401 Unauthorized 响应);
- 一切都检查出来了,你有一个有效的用户对象,所以你传递它
next(null, user)
:这将触发successRedirect
;
如果身份验证无效(但不是内部错误),您可以将额外消息与回调一起传递:
next(null, false, { message : 'invalid e-mail address or password' });
如果您使用failureFlash
并安装了 connect-flash 中间件,则提供的消息将存储在会话中,并且可以轻松访问,例如在模板中使用。
编辑:也可以自己完全处理身份验证过程的结果(而不是 Passport 发送重定向或 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);
});