Ответ 1
Стратегия-реализация работает совместно с 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-автоответ от HTTP 401); - Все проверяется, у вас есть действительный пользовательский объект, поэтому вы передаете его:
next(null, user)
; это вызоветsuccessRedirect
;
В случае недопустимой проверки подлинности (но не внутренней ошибки) вы можете передать дополнительное сообщение вместе с обратным вызовом:
next(null, false, { message : 'invalid e-mail address or password' });
Если вы использовали failureFlash
и установили промежуточное программное обеспечение connect-flash, поставляемое сообщение сохраняется в сеансе и может быть легко доступно для доступа, например, используется в шаблоне.
РЕДАКТИРОВАТЬ: также можно полностью обрабатывать результат процесса аутентификации самостоятельно (вместо паспорта, отправляющего перенаправление или 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);
});