我们当前正在构建具有通过HTTPS进行摘要式身份验证的PHP SoapClient。一切都对主wsdl文件起作用,但是wsdl文件在另一个URL上导入了xsd模式。问题在于,摘要头对于SoapClient首次调用以加载主wsdl文件是正确的,因为其结尾为/DispatcherWS?wsdl
,并且生成了Digest-Response属性,其中包括uri /DispatcherWS?wsdl
。现在,SoapClient尝试从/DispatcherWS?xsd=1
导入模式,这是行不通的,因为它是另一个uri,并且Digest-Auth-Header应该用Schema-Import的uri重新生成。如何使用PHP SoapClient存档此行为。
来自失败的架构导入的错误是:
"SOAP-ERROR: Parsing Schema: can't import schema from 'https://EXAMPLE.COM:443/webservice/DispatcherWS?xsd=1'"
我们的代码:
$soapParams = [
'encoding' => 'UTF-8',
'trace' => 1,
'exceptions' => false,
'cache_wsdl' => WSDL_CACHE_NONE,
'authentication' => SOAP_AUTHENTICATION_DIGEST,
'login' => $this->username,
'password' => $this->password,
'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
'stream_context' => stream_context_create([
'http' => [
'header' => sprintf('Authorization: Digest username="***", realm="***", nonce="***", uri="/webservice/DispatcherWS?wsdl", algorithm="MD5", qop=auth, nc=00000001, cnonce="***", response="***", opaque="***"')
]
])
];
$this->client = new SoapClient($this->wsdl, $soapParams);
(是的,摘要身份验证的用户名,密码和生成的哈希是正确的,我们用邮递员对其进行了测试。)
顺便说一下,一切都在邮递员中工作,因此邮递员必须实现另一种逻辑以重新生成auth标头。
我们用Google搜索了很多,并在此主题上花了整整两天的时间。如果任何人在过去遇到过同样的问题,并且可以向我们提供一些提示或解决方案,那将是很好的。在此先感谢!