PHP SoapClient не работает для моего WebService.Основная проблема с аутентификацией? - PullRequest
0 голосов
/ 28 октября 2018

Мне нужно вызвать мыльный Web-сервис, который нуждается в базовой аутентификации. Я попробовал 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 голосов
/ 31 октября 2018

Мне удалось получить список служб без включения логина / пароля в запрос 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();
}
0 голосов
/ 28 октября 2018

Базовая аутентификация возможна с классом php SoapClient.Как указано в документации для конструктора класса SoapClient, вы можете использовать опции login и password для базовой аутентификации.

$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
    ]
);

Это работает довольно хорошоа также.

...