5

我正在尝试使用 PHP 访问 SOAP WebService。该服务是在客户现场安装和配置的 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";
  }
}

但是,如果我将服务器配置为使用 NTLM 的 SPNEGO,它显然不能开箱即用。我尝试更改以下内容:

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);

在四处搜索和试验之后,我发现有人建议只提供用户名而不提供密码:

curl_setopt($ch, CURLOPT_USERPWD, "<user>");

以上都没有奏效。CURL 总是以 HTTP 401 Unauthorized 响应。

运行 phpinfo(); 结果 PHP 告诉我 CURL 启用了 SPNEGO。

所以,我认为为我的请求启用 SPNEGO 可能不是那么“容易”,但我从未使用过它,而且我找不到任何关于如何使用 PHP 执行 SPNEGO 请求的资源,所以要么我错过了某事,或者我可能需要另一种方法。任何提示或建议表示赞赏。

注意:不幸的是,我需要连接到该服务的各种实例。虽然我们几乎总是负责管理服务,但 SPNEGO 是默认设置,我们的许多客户不希望将其更改为 NTLM,因此我不得不同时支持这两种模式。

4

0 回答 0