Сбор/обработка заголовков в PHP Soap Server

Я создаю веб-службу, используя собственные методы SOAP PHP5. Все шло нормально, пока я не попытался выполнить аутентификацию с помощью заголовков SOAP.

Я мог легко найти, как добавить имя пользователя/пароль в заголовки SOAP, на стороне клиента:

$myclient = new SoapClient($wsdl, $options);

$login = new SOAPHeader($wsdl, 'email', 'mylogin');
$password = new SOAPHeader($wsdl, 'password', 'mypassword');
$headers = array($login, $password);

$myclient->__setSOAPHeaders($headers);

Но я нигде не могу найти методы сбора и обработки этих заголовков на стороне сервера. Я предполагаю, что должен быть простой способ определить метод в моем SoapServer, который обрабатывает заголовки...


person altermativ    schedule 06.07.2009    source источник


Ответы (4)


SoapClient использует имя пользователя и пароль для аутентификации HTTP. Поддерживается базовая и дайджест-аутентификация (см. источник )

Для получения информации о реализации HTTP-аутентификации в PHP на стороне сервера см. эту страницу руководства.

Если вы не хотите использовать HTTP-аутентификацию, см. данный пользователем образец на странице руководства SoapServer, где показано, как передать некоторые учетные данные в заголовке UsernameToken.

person Paul Dixon    schedule 06.07.2009
comment
Я пытаюсь поймать заголовки, используя только библиотеку SOAP, поэтому без аутентификации HTTP. И я попробовал упомянутый вами пользовательский пример, но он работает только тогда, когда я не использую определение WSDL. Может быть, мне нужно определить заголовки в WSDL, я продолжу поиск. Спасибо за ваш вклад. - person altermativ; 07.07.2009
comment
Да, вам нужно определить заголовки в файле WSDL. - person Ant; 03.02.2012
comment
Я получил отличный ответ от osarogabriel. blogspot.com/2014/04/. Посмотрите, там очень понятно объясняется, как это сделать. - person Muc; 17.10.2018

В современной версии PHP НЕ нет необходимости добавлять что-либо в WSDL, поскольку заголовки являются частью спецификации SOAP Envelope.

Приведенный пользователем пример, приведенный Полом Диксоном, не работает просто потому, что заголовок не UserToken, как написано в комментарии, а заголовок Security, так что это имя должно быть у метода класса. Затем вы получаете хороший объект stdClass со свойством объекта UserToken stdClass, которое имеет имя пользователя и пароль в качестве свойств.

Пример кода (для вставки в класс PHP, реализующий службу SOAP:

   public function Security( $header  ){
      $this->Authenticated = true; // This should be the result of an authenticating method
      $this->Username = $header->UsernameToken->Username;
      $this->Password = $header->UsernameToken->Password;
    }

Работает как шарм для WSSE Soap Security на основе имени пользователя и пароля.

person Victoriano    schedule 28.07.2014

Вы можете попробовать прочитать данные RAW POST.

if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
    $xml = file_get_contents('php://input');
    print( htmlspecialchars( $xml ) );
    // XML processing
}

В $xml у вас будет весь XML-запрос SOAP.

SoapServer не имеет методов для чтения заголовков SOAP.

-- edit: добавленный пример из руководства не работает, метод обработки заголовков никогда не вызывается

person dr_bonzo    schedule 17.01.2010

Вы должны использовать текущую версию PHP. С PHP 5.2.4 у меня была та же проблема, но с 5.2.17 или 5.3.8 вызывается обратный вызов для обработки заголовка SOAP (описанный в пользовательском образце на php.net), и все работает довольно хорошо.

person Ben    schedule 18.10.2011