Запрос SOAP XML с базовой аутентификацией в PHP - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь настроить запрос SOAP в PHP с использованием базовой аутентификации HTTP.По какой-то причине я продолжаю получать HTTP / 1.1 401 Unauthorized error.

Это пример запроса, который я пытаюсь создать:

POST https://url/someurl/soap HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "SomeSoapAction"
User-Agent: SomeUser Client-HttpClient/3.1
Content-Length: 1503
Authorization: Basic dGsomebasicreyteryheyp0ZXN0ZXI=
Host: somehost.com  

Thisэто фрагмент моего кода:

ini_set('display_errors',1);
ini_set("soap.wsdl_cache_enabled", "0");
error_reporting(E_ALL);
$wsdl = "urltosomewsdlfile.wsdl";
$url = "somerl";
$username = "username";
$password = "password";
$encodedstuff = base64_encode("{$username}:{$password}");

$client = new SoapClient($wsdl, array('exceptions' => true,'trace' => true,'login' => 'somelogin', 'password' => 'somepw'));
$header = new SoapHeader($url, 'Authorization: Basic', $encodedstuff);
$client->__setSoapHeaders($header);

try {
    $result = $client->SomeSoapAction();
    } catch (SoapFault $soapFault) {
        var_dump($soapFault);
        echo "<br />Request :<br />", htmlentities($client->__getLastRequest()), "<br />";
        echo "<br />Response :<br />", htmlentities($client->__getLastResponse()), "<br />";
    }

Если я извлекаю имя пользователя и пароль из нового раздела SoapClient , он выдает Uncaught SoapFault исключение: [WSDL] SOAP-ОШИБКА: синтаксический анализ WSDL: невозможно загрузить из ...

Если я добавлю закодированную переменную base64 в новый раздел SoapClient вместо имени пользователя / pw, он выдастта же ошибка синтаксического анализа, что и выше: $ client = new SoapClient ($ wsdl, array ('authentication' => "Basic $ encodedstuff", "exception" => true, 'trace' => true,));

Имя пользователя и пароль работают при прямой загрузке URL.

Может кто-нибудь указать мне правильное направление?Спасибо за любую помощь.


Обновление 18.12.18: я пробовал это как предложенный новый метод, но все еще получаю то же сообщение об ошибке 401:

$opts = array( 'http'=>array( 'method'=>"POST", 'header' => "Authorization: Basic " . base64_encode("{$user}:{$pw}") ) ); 
$context = stream_context_create($opts); 
$client = new SoapClient($wsdl, array('stream_context' => $context,'exceptions' => true,'trace' => true,)); 
$header = new SoapHeader($url, 'Authorization: Basic', $encodedstuff); 
$client->__setSoapHeaders($header);

Обновление 15.01.19: У меня все еще проблемы с этим.

Используя SOAPUI, я могу сделать успешный запрос и получить аутентификацию.Я не вижу разницы между запросом SOAPUI и моим собственным запросом PHP.

Я заметил, что заголовок запроса, созданный моим кодом PHP, изменяет URL-адреса конечных точек POST и Host.В первой части POST URL удален домен, а у Host также удален первый раздел URL.

Заголовок запроса SOAPUI (правильно возвращает 200):

POST https://test-example.com/file/SOAP HTTP/1.1
Host: test-example.com

Заголовок запроса PHP (возвращает 401):

POST /file/SOAP HTTP/1.1
Host: example.com

Это, кажется, вызывает проблему какпохоже, я указываю на неверную конечную точку.Кто-нибудь есть какие-либо советы о том, что может быть не так с моим кодом PHP, чтобы нарушить этот запрос?Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...