Сбор / обработка заголовков в 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), и все работает довольно хорошо.