viernes, 2 de noviembre de 2007

Un poco más de SOAP - cabecera de seguridad

En un acceso por Web Service he tenido que utilizar una cabecera de seguridad. Para crear los nodos previstos por el estándar WSSE he tenido que hacer lo siguiente:

driver = ClassThatXtendsSOAPRPCDriver.new
sh = SOAP::SOAPHeader.new
sec = SOAP::SOAPElement.new('wsse:Security')
sec.add(SOAP::SOAPElement.new('wsse:UsernameToken'))
sec['wsse:UsernameToken'].add(SOAP::SOAPElement.new('wsse:Username', 'Iamtheman'))
sec['wsse:UsernameToken'].add(SOAP::SOAPElement.new('wsse:Password', 'Iamthelaw'))
sec.extraattr['mustUnderstand'] = '1'
sec.extraattr['xmlns:wsse'] = 'url_for_wssecurity_xsd'
sh.add('wsse:Security', sec)
sb = SOAP::SOAPBody.new
sb.add('OTA_HotelAvailRQ', SOAP::SOAPElement.new('my_node'))
...
my_response = driver.invoke(sh, sb)


He tenido que trabajar de esta forma porque con soap4r no he podido generar un driver adecuado a mis necesidades. Con la versión 1.5.7 hay nodos dentro de los ficheros XSD que no sabe interpretar y por ello no genera bien los tipos de datos que utiliza el driver. Parece que esto se arregla en la 1.5.8. Tendremos que probarlo.

Salud¡