Я просмотрел документацию и получил приложение expressjs, работающее с конечными точками входа и выхода с использованием passport_ldapauth и сессий. Сеанс сохраняется в базе данных с использованием sequelize, а cookie, содержащий только идентификатор сессии, срок действия, путь и домен, сохраняются в браузере.
Я сейчас пытаюсь обезопасить свои другие конечные точки. В консоли я вижу, что десериализатор запускается первым, и правильный запрос отправляется в таблицу сеансов базы данных, ища моего пользователя по правильному идентификатору сеанса и находит его.
Но затем - вызывается passport_ldapauth и, поскольку пароля нет, я получаю флэш-сообщение «Отсутствуют учетные данные» и возвращается 400.
Я думаю, это то, о чем говорил Кав в своем втором комментарии здесь (https://github.com/vesse/passport-ldapauth/issues/53), который не получил ответа.
Возможно, я усложняю это? Должен ли я просто переключиться на сессионную стратегию (если она существует) вместо 'ldapauth', как только я вошел в систему для других моих маршрутов? Или это должно работать и не работает? Или я просто что-то не так делаю?
Вот этот маршрут:
api.post('/role/add', passport.authenticate(
'ldapauth', {session: true, failureFlash: true}
), (req, res, next) => {
Roles.create(req.body).then(
role => res.json(role)
).catch(err => {
if (err) {
console.log(err);
next(err);
}
});
});
Что еще мне нужно предоставить, чтобы помочь мне?
Возможно, мой сериализатор или десериализатор плохие? Кажется, они работают для конечных точек входа / выхода. Смотрите ниже:
passport.serializeUser(function(user, done) {
let sessionUser = {
username: user.sAMAccountName,
sessionID: user.sessionID
};
done(null, sessionUser);
});
passport.deserializeUser(function(user, done) {
Session.findOne({where: {sid: user.sessionID}}).then(user => {
return done(null, user);
});
});
Обратите внимание, что объект пользователя, возвращаемый из Active Directory, является ОГРОМНЫМ, поэтому я переписываю все это как минимум username и sessionID. Я не уверен, но я думаю, что пользователь, возвращаемый findOne, может быть или не быть объектом «паспорт», содержащимся в столбце «данные» базы данных. Хм. Нужно ли гарантировать, что это так? Возможно, пользователь - это целая строка из БД.