Расширение php SoapClient для аутентификации на уровне сайта - PullRequest
5 голосов
/ 02 июня 2011

Короткая версия

Я хочу расширить SoapClient, чтобы он делал это внутренне при доступе к WSDL:

curl -L -E /location/of/cert.pem -c /tmp/location/of/cookie.jar https://web-service-provider/servicename?wsdl

Длинная версия

У меня естьSOAP-запрос похож на этот:

$serviceUrl = 'https://service-url';
$wsdl = $serviceUrl . '?wsdl';

$proxyServiceUrl = 'http://localhost/myproxy.php?url=$serviceUrl';
$proxyWsdl = 'http://localhost/myproxy.php?url=$wsdl';

$options = array(
  'cache_wsdl'    => WSDL_CACHE_NONE,
  'encoding'      => 'utf-8',
  'soap_version'  => SOAP_1_1,
  'exceptions'    => true,
  'trace'         => true,
  'location'      => $proxyServiceUrl
);

$client = new SoapClient($proxyWsdl, $options);

$params = array( /* */ );
$client->someOperation($params);

Как видите, все довольно стандартно, кроме прокси-бита.

Причина прокси

Я написал прокси-сервер, чтобы выполнить требование поставщика веб-служб о том, что все конечные точки, включая WSDL, должны обрабатываться через систему аутентификации, называемую siteminder.

Функция прокси довольно проста, если она написанав командной строке linux curl это будет примерно так:

curl -L -E /location/of/cert.pem -c /tmp/location/of/cookie.jar https://web-service-provider/servicename?wsdl

Если быть точным:

* Follow all redirections
* specify location of .pem file (and password)
* specify location of cookie jar

Это все отлично работает:)

НО недавно поставщик услуг решил изменить свой WSDL.

Теперь он импортирует файлы схемы (.xsd), что не так уж и плохо, за исключением того, что это относительно WSDL.

Относительно файла WSDL означает, что синтаксический анализатор SoapClientтеперь ищет файлы схемы из местоположения прокси.ОШИБКА, не могу найти!

Подробнее об этой проблеме здесь:

php SoapClient завершается ошибкой при передаче wsdl с относительными схемами путей

Итак, мой вопрос:

Как мне переписать SoapClient (конечно, расширив его), чтобы все равно проходить аутентификацию на уровне сайта, но без необходимости проходить через этот дополнительный прокси?

Мои первоначальные мысли таковы, что каким-то образом мне нужно переписать функцию доступа к URI (если она существует), но без особого документирования в этой области я не уверен, с чего начать.

В качестве альтернативы, я мог бы иметьвзломать SoapServer как-нибудь.

Буду признателен за любую помощь, которую я могу получить, включая указатели на любую документацию по внутренним компонентам SoapClient.

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Ответ на эту проблему почесывания головы и выпадения волос можно найти здесь:

http://rabaix.net/en/articles/2008/03/13/using-soap-php-with-ntlm-authentication.

Спасибо Джеффри Фернандесу из списка рассылки php мыла, который указал на это.

2 голосов
/ 06 июня 2011

Если вопрос заключается только в предоставлении файла .pem, рассматривали ли вы параметр local_cert для конструктора SoapClient? Этот клиентский объект должен затем сохранять любые файлы cookie, установленные для сеанса. Если вам также необходимо сохранить файлы cookie во время сеансов, вы всегда можете прочитать их из ответа (используйте __getLastResponseHeaders), а затем используйте __setCookie, чтобы установить их снова в следующий раз.

Или вы можете просто попросить вашего прокси заменить относительные пути абсолютными. В конце концов, wsdl сам по себе является XML-документом.

Или вы можете превратить свой прокси в настоящий прокси и использовать опции proxy_host, proxy_port, proxy_login и proxy_password.

...