我有一台使用CURL连接到它的服务器只能使用
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
现在我需要使用SOAP连接到同一台服务器 如何将基本身份验证设置为soapclient?
由于
答案 0 :(得分:1)
php-soap有一个限制/错误,它不允许在使用身份验证时检索WSDL(bug report)
您可以更新/升级您的PHP版本。有人报告说这个bug在5.4.8版本上得到了解决。
要保留php-soap,你必须使用我不推荐的本地/静态版本的WSDL。
虽然它可能性能较差,但我建议您查看另一个PHP Soap客户端库,例如NuSOAP。
答案 1 :(得分:0)
我们遇到了与JDE连接类似的问题。验证实体WSSE需要与wsdl服务器一起添加,接受来自服务器(php脚本所在的位置)的请求
$Username = '******';
$Password = '******';
$xmlHeader =
'<soapenv:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" soapenv:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<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>
</soapenv:Header>';
还应设置一些额外的信封信息
$this->ch = curl_init( $this->postURL );
curl_setopt( $this->ch, CURLOPT_POST, TRUE);
curl_setopt( $this->ch, CURLOPT_SSLVERSION, 'SSLv3');
curl_setopt( $this->ch, CURLOPT_POSTFIELDS, $this->postArg);
curl_setopt( $this->ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $this->ch, CURLOPT_HEADER, 0);
curl_setopt( $this->ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt( $this->ch, CURLOPT_VERBOSE, TRUE);
curl_setopt( $this->ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
// GET RESPONSE AND RESPONSE CODE
try{
$this->response = curl_exec( $this->ch );
$this->responseCode = curl_getinfo($this->ch, CURLINFO_HTTP_CODE);
if($this->responseCode != '200'){
//ERROR!!
}
}catch(Exception $e){
$e->getMessage();
}
注意CURLOPT_SSLVERSION = SSLv3。您需要查看访问WSDL所需的SSL版本。
答案 2 :(得分:0)
您是否尝试使用&#39;登录&#39;和密码&#39;从SoapClient构造函数选项? 这里描述了它们:http://pl1.php.net/manual/en/soapclient.soapclient.php
答案 3 :(得分:-1)
您需要发送带有身份验证信息的soap标头:
$param = new SoapVar(array('username' => 'username', 'password' => 'password'), SO AP_ENC_OBJECT);
$header = new SoapHeader('http://localhost/soap_server/server.php', 'AuthenticationInfo', $param, false);
然后将其传递给SOAP客户端对象
$client = new SoapClient($url, array('trace' => 1));
$client->__setSoapHeaders(array($header));
答案 4 :(得分:-1)
实际上,有可能使用php-soap的标准方法。
有一个名为stream_context
的选项。有关此内容的更多信息,请访问:http://php.net/manual/en/context.php
您应该提供具有Authorization标头的上下文。例如:
$context = [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
],
'http' => [
'header' => 'Authorization: Basic ' .base64_encode('user:pass'),
],
];
$client = new \SoapClient('wdsl', [
'login' => 'user',
'password' => 'pass',
'stream_context' => stream_context_create($context),
]);