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

时间:2018-10-28 20:40:31

标签: php authentication soap soap-client php-curl

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

我正在尝试与SoapClient进行相同的呼叫,但无法正常工作。据我了解(在Burp Software的帮助下)身份验证标头不是与soapClient一起发送的。

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

这是我正在使用的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
)

2 个答案:

答案 0 :(得分:1)

我设法在wsdl请求中不包含登录名/密码的情况下获得了服务列表,所以soapclient正在与此服务器一起工作。

使用登录名和密码时出现500错误,因此在服务器端似乎是一个问题。

以下代码可帮助您获得有关肥皂响应的更多详细信息

<?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();
}

答案 1 :(得分:0)

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

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

仅此而已。不需要其他标题。

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

评论后编辑

这也是一种使用基本身份验证读取wsdl文件的方法。

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

这也很好。