Я использую passjs для аутентификации своего экспресс-приложения. То, что я сделал, очень похоже на код учебника, но сеанс аутентификации всегда меня задевает.passjs не удалось аутентифицировать экспресс-сессию
В моем основном рабочем процессе я аутентификация пользователя с использованием местной стратегии
passport.authenticate('local', function (err, user, info) {
if (err) {
req.flash('error', { msg: err.message });
return res.redirect('back');
}
if (!user) {
// punish abuser...
})
.catch(function (err) {
req.flash('error', { msg: err.message });
return res.redirect('back');
});
} else {
// Log user in
debug('Info: ' + 'Logging in'.green.bold);
req.logIn(user, function (err) {
if (err) {
debug('Info: ' + 'Error occured '.red.bold);
req.flash('error', { msg: err.message });
res.redirect('back');
}
// req.session.passport.user = user.id; // <-- even tried hack, didn't work
// Send user on their merry way
res.redirect('/homepage');
});
}
})
Тогда для всех REQ на/домашнюю страницу, я заставить их проверить, если пользователь аутентифицирован
app.all('/api*', passportConf.isAuthenticated);
где isAuthenticated() определяются как
exports.isAuthenticated = function (req, res, next) {
// Is the user authenticated?
if (req.isAuthenticated()) {
debug('Info: ' + '----authentication verified');
return next();
} else {
debug('Info: ' + '----authentication verification failed');
// flash error message etc...
return res.redirect('/login');
}
};
Результаты показаны:
Info: --->> Password Matched! <<--- +0ms
Info: Logging in +0ms
Info: serializing user +0ms
...
POST /login 302 295.015 ms - 64
...
Executing (default): UPDATE "Sessions" SET "data"='{"cookie":{"//cookie"},"passport":{"user":37}}'
...
Info: ----authentication verification failed +0ms
....
GET /api 302 19.094 ms - 68
Executing (default): UPDATE "Sessions" SET "data"='{"cookie":{"//cookie"},"passport":{}, "attemptedURL":"/api"}
...
Info: de-serializing user +20ms
...
Executing (default): SELECT "//fields" FROM "Users" AS "User" WHERE "User"."id" = 37 LIMIT 1;
Error: 500 [object SequelizeInstance:User] +5ms
Запрос, безусловно, проходит проверку пароля и проходит до момента перенаправления и после того, как перенаправляется.
Есть 3 возможные причины, которые я наблюдал:
- Два сеанса UPDATE записи идентичны, за исключением, что первый один имеет user.id сериализовать в, после редиректа, пользователь ушел.
- de-serializing user и операция SELECT для поиска пользователя происходит после того, как запрос был приговорен к смерти. Возможно, возникла некоторая проблема с упорядочением/асинхронностью с моим кодом (я смотрел повсюду и ничего не нашел.)
- 500 [object SequelizeInstance: User] действительно ошибка черного ящика, я понятия не имею, что это подразумевает ..
Застрял в этом в течение многих ночей ... любая помощь в этом очень ценится ...