PHP SOAP-запрос на обслуживание с использованием SPNEGO
Я пытаюсь получить доступ к SOAP WebService с помощью PHP. Служба - это служба Windows, которая устанавливается и настраивается на месте клиента. Сервер, к которому я подключаюсь, настраивается для принятия двух разных режимов аутентификации. NTLM или SPNEGO.
Мне удалось без проблем успешно подключиться к серверу, когда он настроен на использование NTLM, используя следующий класс расширения SoapClient:
class NTLMSoapClient extends SoapClient {
function __doRequest($request, $location, $action, $version, $one_way = NULL) {
$headers = array(
'Method: POST',
'Connection: Keep-Alive',
'User-Agent: PHP-SOAP-CURL',
'Content-Type: text/xml; charset=utf-8',
'SOAPAction: "'.$action.'"',
);
$this->__last_request_headers = $headers;
$ch = curl_init($location);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($ch, CURLOPT_USERPWD, "<user>:<password>");
$response = curl_exec($ch);
return $response;
}
function __getLastRequestHeaders() {
return implode("\n", $this->__last_request_headers)."\n";
}
}
Однако, если я настраиваю сервер для использования SPNEGO вместо NTLM, он, очевидно, не работает "из коробки". Я пытался изменить следующее:
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
После поисков и экспериментов я нашел людей, предлагающих вводить имя пользователя только без пароля:
curl_setopt($ch, CURLOPT_USERPWD, "<user>");
Ничто из вышеперечисленного не сработало. CURL всегда отвечает HTTP 401 Unauthorized.
Запуск phpinfo(); в результате PHP говорит мне, что в CURL включен SPNEGO.
Итак, я считаю, что это может быть не так просто включить SPNEGO для моего запроса, но я никогда не работал с ним, и я не мог найти какие-либо ресурсы, как сделать SPNEGO-запрос с PHP, поэтому я либо отсутствует что-то или, может быть, мне нужен другой подход. Любые намеки или предложения приветствуются.
Примечание. К сожалению, мне нужно подключиться к различным экземплярам этого сервиса. Хотя мы почти всегда отвечаем за управление сервисом, SPNEGO используется по умолчанию, и многие наши клиенты не хотят менять его на NTLM, поэтому я вынужден поддерживать оба режима.