PHP SoapClient 不适用于我的 WebService。基本身份验证问题?

PHP SoapClient doesn't work for my WebService. Basic Authentication problem?

我必须调用需要基本身份验证的 soap WebService。我尝试了带有基本身份验证的 SoapUI 及其工作。可以从浏览器正确加载 WSDL 页面。不存在与 SSL 相关的问题。

我正在尝试使用 SoapClient 进行相同的调用,但无法正常工作。据我了解(在 Burp 软件的帮助下)身份验证 header 不使用 soapClient 发送。

当我遇到这个问题时,我检查了 Whosebug 上的几乎所有相关问题并尝试了他们建议的所有内容。

这是我正在处理的 PHP 代码:

echo "<pre>";

$WSDL_URL='https://myserver.com/services/?wsdl';

$username='xxx';    
$password='yyy';

$params = array(
    'login' => $username,
    'password' => $password,
    'trace' => 0,
    'exceptions' => 0,
    'location' => $WSDL_URL,
    'uri' => $WSDL_URL
);

$soap = new SoapClient(null, $params);

$RESULT = $soap->serviceTest( 'HELLO' );
echo "<h1>ServiceTEST Result:</h1>";
print_r($RESULT);

这是我的错误:

SoapFault Object
(
    [message:protected] => Client Error
    [string:Exception:private] => 
    [code:protected] => 0
    [file:protected] => /Applications/MAMP/htdocs/soap/test.php
    [line:protected] => 24
    [trace:Exception:private] => Array
        (
            [0] => Array
                (
                    [file] => /Applications/MAMP/htdocs/soap/test.php
                    [line] => 24
                    [function] => __call
                    [class] => SoapClient
                    [type] => ->
                    [args] => Array
                        (
                            [0] => serviceTest
                            [1] => Array
                                (
                                    [0] => HELLO
                                )
                        )
                )
        )
    [previous:Exception:private] => 
    [faultstring] => Client Error
    [faultcode] => s:Client
)

php SoapClient class 可以进行基本身份验证。正如 SoapClient class 构造函数的 documentation 中所述,您可以使用选项 loginpassword 进行基本身份验证。

$client = new \SoapClient($wsdl, [
    'login' => $username,
    'password' => $password,
]);

就是这样。不需要进一步 headers。

您必须知道,php 只会在调用服务本身时发送凭据,而不会在获取 wsdl 文件时发送。

评论后编辑

这里还有一种方法,您也可以使用基本身份验证来读取 wsdl 文件。

$client = new \SoapClient(
    'http://' . urlencode($login) . ':' . urlencode($password) . '@www.server.com/path/to/wsdl',
    [
        'login' => $login,
        'password' => $password
    ]
);

这也很好用。

我设法在 wsdl 请求中不包含 login/password 的情况下获取服务列表,所以是的,soapclient 正在使用此服务器。

我在使用登录名和密码时遇到了 500 错误,所以这似乎是服务器端的问题。

这是可以帮助您了解有关 soap 响应的更多详细信息的代码

<?php

$username='xxx'; 
$password='yyy';
$WSDL_URL='https://myserver.com/services/?wsdl';


$params = array(
    // witout params it works at least for the wsdl
    //'login' => $username,
    //'password' => $password
);
try {
    $soap = new SoapClient( $WSDL_URL, $params);


    $RESULT = $soap->__getFunctions();
    print_r($RESULT);
    // uncomment that and you'll have the error
    //$soap->serviceTest('bob');
}
catch (SoapFault $fault) {
    echo "SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})";
}
catch (Exception $e) {
    echo $e->getMessage();
    echo $e->getTraceAsString();
}