【问题标题】:Extending php SoapClient for siteminder authentication扩展 php SoapClient 以进行站点管理员身​​份验证
【发布时间】:2011-06-02 09:57:25
【问题描述】:

短版

我想扩展 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 服务提供商的要求,即所有端点(包括 WSDL)都通过称为 siteminder 的身份验证系统进行处理。

proxy的功能很简单,如果用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(当然是通过扩展它),以仍然通过站点管理员身​​份验证,但不必通过那个额外的代理?

我最初的想法是,我必须以某种方式重写 URI 访问器函数(如果存在的话),但在这方面没有太多文档,我不知道从哪里开始。

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

如果我能得到任何帮助,我将不胜感激,包括指向 SoapClient 内部的任何文档的指针。

【问题讨论】:

    标签: php soap-client ntlm siteminder soapserver


    【解决方案1】:

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

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

    或者你可以将你的代理变成一个实际的代理,并使用 proxy_host、proxy_port、proxy_login 和 proxy_password 选项。

    【讨论】:

    • 嗨,Anomie,感谢您的回答。我无法使用 SoapClient 执行我提到的完整 curl 请求以获取 wsdl。特别是,遵循重定向并使用 cookie jar(不仅仅是设置 cookie)。关于编辑 xml,这不是一个选项,因为架构文件包含其他架构文件。
    • 即。您的建议无助于我在此图中成功处理步骤 1:codeproject.com/KB/ajax/JavaScriptSOAPClient/…
    【解决方案2】:

    这个挠头、拉头发的问题的答案可以在这里找到:

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

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

    【讨论】:

    • 有没有其他方法可以获取相对路径?php中还存在这个bug吗?
    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2011-06-18
    • 2019-10-27
    相关资源
    最近更新 更多