Задать вопрос
tvolf
@tvolf

Как из PHP (SoapClient) получить доступ к WSDL веб-сервису Lotus Domino при требовании cookie последним?

Всем привет.

Столкнулся с такой проблемой. Имеется сервер Lotus Domino, при помощи которого поднят WSDL веб-сервис.
Этот веб-сервис использует авторизацию по логину и паролю. То есть, грубо говоря, если я напрямую пробую получить GET-запросом страницу exampe.com/....?WSDL, то я сначала попадаю на страницу авторизации example.com/names.nsf?Login, на которой мне предлагается ввести пароль и логин. Если пароль и логин правильные, то путем 302-редиректа мне отдается нормальное содержимое основной страницы веб-сервиса.
При этом при правильном вводе логина и пароля устанавливается кука вида :
DomAuthSessId=XXXXXXXXXX
Кука ставится на рабочий сеанс. Это была преамбула.
Теперь к самой проблеме.
Для использования этого веб-сервиса из PHP я использую (прошу прощения за тавтологию) SoapClient.
Общий механизм использования:

$client = new SoapClient( 'example.com/....?WSDL');
$client->funcName(...params...);
...

На первой же строке я получаю SOAP-исключение о некорректности полученной страницы ?WSDL. Оно и понятно -
куки никак не передаются, и я получаю не WSDL-информацию, а форму для ввода логина и пароля.
Загуглил на тему передачи кук при работе с SOAP. Есть функция $client->__setCookie(), которая позволяет их устанавливать. Но для этого нужен, как минимум, нормально инстанцированный клиент (то есть, переменная $client), а он у меня даже не создается нормально...
Я попробовал самостоятельно перед вызовом new SoapClient() выполнить POST-запрос на URL из формы авторизации и считать куку DomAuthSessId. Значение ее получаю, но вот что с ней потом делать ? Ведь при первом же вызове new SoapClient() будет использовано другое соединение, которое будет требовать куку с другим значением ?
Ситуация вообще непонятная, ведь до создания SoapClient'а значения куки мы знать не можем (она будет известна только после того, как мы пройдем авторизацию).
Подскажите, пожалуйста, как быть ? Может, кто-то сталкивался с чем-то аналогичным ?
Заранее благодарю.
  • Вопрос задан
  • 701 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@raincons
Почему вы считаете, что кука, полученная из post запроса не подойдет? Сформируйте stream_context с этой кукой и передайте его при создании SoapClient
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Cookie: DomAuthSessId=XXXXXXXXXX\r\n"
  )
);
$context = stream_context_create($opts);
$client = new SoapClient('...', array('stream_context' => $context));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы