Сбор / обработка заголовков в 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, который обрабатывает заголовки...

4 ответа

Решение

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

Информацию о реализации HTTP-аутентификации в PHP на стороне сервера смотрите на этой странице руководства.

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

В современной версии 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

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

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

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

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

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

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

Другие вопросы по тегам