【发布时间】:2016-09-29 13:37:24
【问题描述】:
我得到了一个不包含任何soap 头模式或定义的WSDL,但端点需要一个WSSE 类型的头。我正在使用SoapClient 来处理这些请求。
所有请求的标头中都必须包含这个:
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>Username</wsse:Username>
<wsse:Password type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
如果我沿着 StackOverflow 和在线 PHP 文档 cmets 多次建议的路线,我能得到的最接近的是:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="..." xmlns:ns2="..." xmlns:ns3="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<SOAP-ENV:Header>
<ns3:Security>
<ns3:UsernameToken>
<ns3:Username>Username</ns3:Username>
<ns3:Password>Password</ns3:Password>
</ns3:UsernameToken>
</ns3:Security>
...
注意它是如何将命名空间添加到soap信封的,而给出的规范/示例将命名空间专门添加到Security元素。不过,我认为这并不重要。无论哪种方式,Password 元素都缺少它的 type 属性。
我也试过沿着数组路线走,使用:
$securityNamespace = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
// ...
$password = new \SoapVar(
[
'_' => 'Password',
'type' => 'http://...'
],
SOAP_ENC_OBJECT,
null,
$securityNamespace,
null,
$securityNamespace
);
生成如下:
<value>
<item>
<key>_</key>
<value>PASSWORD</value>
</item>
<item>
<key>type</key>
<value>http://...</value>
</item>
</value>
这显然是 SoapClient 找不到要验证的元素类型时的典型响应。
WSDL 和随附的 XSD 保存在本地以用于缓存目的,是否值得尝试修改 WSDL 以包含 WSSE 标头(如果可能),或者是否有另一种逻辑方法可以为此命名空间生成正确的 SOAP 标头/XSD 架构?
【问题讨论】:
-
作为一种风格,端点明确说明了为什么它们不在其 WSDL 中包含标头信息:1)它是可选的,2)最好不定义身份验证以保持它从实际服务中抽象出来。
标签: php xml soap wsdl soap-client