Recostackción / procesamiento de encabezados en PHP Soap Server

Estoy creando un servicio web usando los métodos SOAP nativos de PHP5. Todo fue bien hasta que traté de manejar la autenticación usando encabezados SOAP.

Podría encontrar fácilmente cómo agregar el nombre de usuario / contraseña a los encabezados SOAP, del lado del cliente :

$myclient = new SoapClient($wsdl, $options); $login = new SOAPHeader($wsdl, 'email', 'mylogin'); $password = new SOAPHeader($wsdl, 'password', 'mypassword'); $headers = array($login, $password); $myclient->__setSOAPHeaders($headers); 

Pero no puedo encontrar en ninguna parte los métodos para recostackr y procesar estos encabezados en el servidor . Supongo que tiene que haber una manera fácil de definir un método en mi SoapServer que maneje los encabezados …

SoapClient usa el nombre de usuario y la contraseña para implementar la autenticación HTTP. La autenticación básica e implícita son compatibles ( ver fuente )

Para obtener información sobre cómo implementar la autenticación HTTP en PHP en el lado del servidor, consulte esta página del manual .

Si no desea utilizar la autenticación HTTP, consulte esta muestra aportada por el usuario en la página del manual de SoapServer, que muestra cómo podría pasar algunas credenciales en un encabezado UsernameToken.

Con una versión PHP moderna NO es necesario agregar nada al WSDL ya que los encabezados forman parte de la especificación SOAP Envelope.

El ejemplo del usuario contribuido citado por Paul Dixon no funciona simplemente porque el encabezado no es UserToken como está escrito en el comentario, el encabezado es Seguridad , así que ese es el nombre que debe tener el método de clase. Luego obtienes un buen objeto stdClass con una propiedad de objeto UserToken stdClass que tiene nombre de usuario y contraseña como propiedades.

Código de ejemplo (para insertar en una clase de PHP que implemente el servicio 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; } 

Funciona como un encanto para la seguridad de soap WSSE basada en nombre de usuario / contraseña

Puedes intentar leer datos de POSTE SIN PROCESAR.

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

En $ xml, tendrá una solicitud SOAP XML completa.

SoapServer no tiene métodos para leer encabezados SOAP.

– editar: el ejemplo contribuido del manual no parece funcionar, el método de manejo del encabezado nunca se llama

Tienes que usar una versión actual de PHP. Con PHP 5.2.4 tuve el mismo problema, pero con 5.2.17 o 5.3.8 se llama a la callback para el manejo del encabezado SOAP (descrito en samle en php.net) y todo funciona bastante bien.