扩展php SoapClient以进行siteminder身份验证

时间:2011-06-02 09:57:26

标签: php soap-client ntlm siteminder soapserver

短版

我想扩展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);

正如您所看到的,除了代理位之外,一切都非常标准。

代理原因

我编写了代理,以满足Web服务提供商的要求,即通过名为siteminder的身份验证系统处理包括WSDL在内的所有端点。

代理的功能非常简单,如果用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 fails when passed a wsdl with relative path schemas

所以我的问题是:

如何重写SoapClient(通过扩展当然),仍然可以通过siteminder身份验证,但无需通过额外的代理?

我最初的想法是,不知怎的,我必须重写URI访问器函数(如果存在)但在这个领域没有太多文档,我不知道从哪里开始。

或者,我可能不得不以某种方式破解SoapServer

感谢我能提供的任何帮助,包括指向SoapClient内部任何文档的指示。

2 个答案:

答案 0 :(得分:2)

如果只是提供.pem文件,您是否查看了SoapClient构造函数的local_cert选项?然后,该客户端对象应保留为会话设置的任何cookie。如果您还需要在会话中保留Cookie,您可以随时将其从响应中读出(使用__getLastResponseHeaders),然后使用__setCookie在下次再次设置它们。

或者你可以让代理用绝对路径替换相对路径。毕竟,wsdl本身就是一个XML文档。

或者您可以将代理转换为实际代理,并使用proxy_host,proxy_port,proxy_login和proxy_password选项。

答案 1 :(得分:2)

这个头部刮伤,头发拉动问题的答案可以在这里找到:

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

感谢Jeff soap Fernandez在php soap邮件列表上指出了这一点。

相关问题