使用SPNEGO针对服务的PHP SOAP请求
我正在尝试使用PHP访问SOAP Web服务。该服务是在客户现场安装和配置的windows服务。我连接的服务器可配置为接受两种不同的身份验证模式。NTLM或SPNEGO 当服务器被配置为使用NTLM时,我能够成功地连接到服务器,而不会出现问题,使用SoapClient的以下扩展类:使用SPNEGO针对服务的PHP SOAP请求,php,web-services,curl,soap,spnego,Php,Web Services,Curl,Soap,Spnego,我正在尝试使用PHP访问SOAP Web服务。该服务是在客户现场安装和配置的windows服务。我连接的服务器可配置为接受两种不同的身份验证模式。NTLM或SPNEGO 当服务器被配置为使用NTLM时,我能够成功地连接到服务器,而不会出现问题,使用SoapClient的以下扩展类: class NTLMSoapClient extends SoapClient { function __doRequest($request, $location, $action, $version, $on
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";
}
}
在四处搜索和试验后,我发现有人建议只提供用户名而不提供密码:
curl_setopt($ch, CURLOPT_USERPWD, "<user>");
curl_setopt($ch,CURLOPT_USERPWD,”);
上述措施都不起作用。CURL总是使用HTTP 401进行响应
运行phpinfo();结果PHP告诉我CURL启用了SPNEGO
因此,我认为为我的请求启用SPNEGO可能不是那么“容易”,但我从未使用过它,并且我找不到任何关于如何使用PHP执行SPNEGO请求的资源,因此,要么我遗漏了一些东西,要么我需要另一种方法。如有任何提示或建议,我们将不胜感激
注意:很遗憾,我需要连接到此服务的各种实例。虽然我们几乎总是负责管理服务,但SPNEGO是默认的,我们的许多客户不希望将其更改为NTLM,因此我不得不支持这两种模式
curl_setopt($ch, CURLOPT_USERPWD, "<user>");