Web Services con PHP + SOAP + WSSE

12/02/12

Gracias a la extensión nativa SOAP de php, leer servicios web SOAP con php es relativamente sencillo. Pero la cosa se complica si a las llamadas al servicio hay que añadir cabeceras de seguridad WSSE (Web Service Security). La extensión de SOAP no contempla estas cabeceras. Esta semana nos hemos peleado con este tema y hemos encontrado dos soluciones.

La primera consiste en extender la clase SoapClient, añadiendo los headers necesarios. Aquí un post en inglés con la clase extendida.

La segunda se basa en añadir los elementos que faltan usando la propia extensión SOAP de php. Veamos los pasos:

1. Creamos dos clases con la estructura necesaria para los headers WSSE, una para el password y username y otra para el token.


<?php
class clsWSSEAuth {
  private $Username;
  private $Password;
  function __construct($username, $password) {
    $this->Username=$username;
    $this->Password=$password;
  }
}

class clsWSSEToken {
  private $UsernameToken;
  function __construct ($innerVal){
    $this->UsernameToken = $innerVal;
  }
}
?>

2. Creamos las variables SOAP para username y password

<?php
$username = tu_username; //pon aquí el username
$password = tu_password; //pon aquí el password

//Consulta qué <em>security name-space</em> está usando el servicio
$strWSSENS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";

$objSoapVarUser = new SoapVar($username, XSD_STRING, NULL, $strWSSENS, NULL, $strWSSENS);
$objSoapVarPass = new SoapVar($password, XSD_STRING, NULL, $strWSSENS, NULL, $strWSSENS);
?>

3. Con estas variables instanciamos la clase clsWSSEAuth creada en el paso 1

<?php
$objWSSEAuth = new clsWSSEAuth($objSoapVarUser, $objSoapVarPass);
?>

4. Creamos una nueva variable Soap a partir del objeto recién creado $objWSSEAuth

<?php
$objSoapVarWSSEAuth = new SoapVar($objWSSEAuth, SOAP_ENC_OBJECT, NULL, $strWSSENS, 'UsernameToken', $strWSSENS);
?>

5. Con esta variable instanciamos la clase clsWSSEToken creada en el paso 1

<?php
$objWSSEToken = new clsWSSEToken($objSoapVarWSSEAuth);
?>


6. Creamos una variable Soap para el nodo 'UsernameToken' a partir  del objeto recién creado $objWSSEToken

<?php
$objSoapVarWSSEToken = new SoapVar($objWSSEToken, SOAP_ENC_OBJECT, NULL, $strWSSENS, 'UsernameToken', $strWSSENS);
?>

7. A partir de ella, creamos otra variable Soap para el nodo 'Security'

<?php
 $objSoapVarHeaderVal=new SoapVar($objSoapVarWSSEToken, SOAP_ENC_OBJECT, NULL, $strWSSENS, 'Security', $strWSSENS);
 ?>

8. Creamos una cabecera Soap a partir del name space $strWSSENS y de la varible recién creada $objSoapVarHeader

<?php
 $objSoapVarWSSEHeader = new SoapHeader($strWSSENS, 'Security', $objSoapVarHeaderVal,true,"http://xxxxxx");

//los últimos parámetros son opcionales y dependerán del servicio
//el cuarto parámetro escribe el atributo mustUnderstand=true en la petición

//el quinto parámetro escribe el atributo actor="http://xxxxx" en la petición

?>

9. Creamos el objeto SoapClient

<?php

//indicamos la versión de SOAP
$arrOptions=array("soap_version"=>SOAP_1_2,"trace" => 1,"exceptions" => 0);
$objClient = new SoapClient($WSDL, $arrOptions);
 ?>

10. Le pasamos las cabecera SOAP creada en 8 al cliente

<?php

$objClient->__setSoapHeaders(array($objSoapVarWSSEHeader));

?>

11. Y finamente llamamos al método que corresponda

<?php
$objResponse = $objClient->__soapCall($strMethod, $requestPayloadString);
?>

Aquí el post original publicado por bhargav.khatana

Suerte!

Añadir nuevo comentario

CAPTCHA

Por favor responde esta pregunta para evitar spam

4 + 16 =

Contacta