Как правильно использовать сеансы с passport_ldapauth? - PullRequest
0 голосов
/ 04 сентября 2018

Я просмотрел документацию и получил приложение 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, может быть или не быть объектом «паспорт», содержащимся в столбце «данные» базы данных. Хм. Нужно ли гарантировать, что это так? Возможно, пользователь - это целая строка из БД.

1 Ответ

0 голосов
/ 05 сентября 2018

Ну, это было смехотворно легко, но нигде в официальных документах я не мог найти это. Так что для тех, кто испытывает трудности с поиском паспорта, вот что я нашел.

req.isAuthenticated ()

Просто напишите свою собственную функцию промежуточного программного обеспечения, либо над маршрутами, либо в отдельном файле, например так:

const unAuthMsg = 'You are not authorized for this endpoint.';

export const ensureAuthenticated = (req, res, next) => {
  if (req.isAuthenticated()) {
    next();
  } else {
    res.status(401).json({"message": unAuthMsg});
  }
};

Тогда используйте его в своих маршрутах, как это:

api.post('/role/add', ensureAuthenticated, (req, res, next) => {
Roles.create(req.body).then(role => {
  return res.json(role)
}).catch(err => {
  if (err) {
    console.log(err);
    next(err);
  }
});
  });

И это все.

...