PHP使用Basic身份验证使用soap服务

时间:2014-07-24 08:10:19

标签: php soap basic-authentication

我有一台使用CURL连接到它的服务器只能使用

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);

现在我需要使用SOAP连接到同一台服务器 如何将基本身份验证设置为soapclient?

由于

5 个答案:

答案 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),
]);