martes, 4 de junio de 2013

Introducción al ESB de WSO2 a través de ejemplos prácticos. II

En esta entrada estaremos viendo cómo crear un servicio proxy en el ESB de WSO2 que primero de acceso al servicio final, para luego incluirle el escenario de seguridad UT garantizando así que los usuarios tengan que autenticarse para acceder al servicio seguro.

Los pasos básicos son los siguientes:

  1. Usaremos el servicio final que creamos en esta entrada y que está desplegado en el AS.
  2. Descargaremos el ESB y lo iniciaremos de la misma forma que se inician todas las herramientas de la suite de WSO2, explicado aquí al inicio.  
  3. Crearemos el servicio proxy en el ESB a través de la UI de administración.
  4. Probaremos el consumo del servicio proxy sin seguridad y veremos la traza de los mensajes tanto en el ESB como en el AS. 
  5. Le asignaremos el escenario de seguridad UT al servicio proxy y veremos las modificaciones a realizar para que funcione correctamente.

Comencemos.!!!

Paso 1:
El servicio ya lo tenemos creado y este es su dashboard en el AS.

Paso 2:
El ESB lo pueden descargar de aquí y luego de descompactarlo lo inician siguiendo las instrucciones antes mencionadas. Verán al final de los logs de inicio de la herramienta la url a través de la cual podrán acceder a su administración. Recuerden que por defecto el usuario es admin y la contraseña es admin.


Paso 3:
Para crear el servicio proxy vayan a la opción del menú que está en la pestaña  Main y ahí en Services/Add/Proxy Service. Verán lo siguiente:

Seleccionen la opción Custom Proxy.
Como pueden apreciar la creación de un servicio proxy pasa por 3 pasos, este que es el primero nos permite especificar el nombre del servicio proxy, el WSDL que expondrá, algunos parámetros generales y los protocolos que podrán ser usados.

Lo más importante aquí es especificar el WSDL. Hay 3 formas de hacerlo:
  • Especificarlo de forma inline, o sea escribir o copiar el WSDL del servicio en una caja que se habilita para esto, lo bueno que tiene es que no se pierde el WSDL
  • Especificar una URL que apunta al WSDL del servicio. Si la URL está offline entonces al reiniciarse el ESB el servicio proxy da error.
  • Primero guardar el WSDL en el registro del ESB y luego obtenerlo del registro. Se puede gestionar en el registro del ESB

Usaremos la segunda opción y apuntaremos a la URL del WSDL del servicio de datos que ya tenemos creado.


Dan clic en Next y verán lo siguiente.


Llegados a este punto quisiera explicar brevemente el flujo básico de los mensajes en el  ESB.
Se usa el concepto de tuberías y filtros porque los mensajes cuando entran al ESB llegan a una tubería identificada por una secuencia de entrada, In Sequence, y a esta secuencia se le pueden aplicar un conjunto de filtros que vendrían siendo los mediadores que posee el ESB. Luego el mensaje sale y llega al servicio final. La respuesta de este servicio llega al ESB y pasa por una secuencia de salida o out Sequence donde se le pueden aplicar filtros hasta que llega al consumidor del servicio. Esto lo pueden apreciar en la siguiente imagen.


Una vez dicho esto vamos a especificar una secuencia de entrada y una secuencia de salida.

En la imagen del paso 2 de 3 seleccionamos en la secuencia de entrada la opción “Define Inline” y veremos cómo nos da la opción de crear la secuencia.

Damos clic en Create y comenzaremos a definir la secuencia de entrada:




Si dan clic en Add Child verán lo siguiente:

Esta es la clasificación de los diferentes mediadores que existen en el ESB, cuando se paren encima de una de estas clasificaciones se les desplegará el listado. Para este ejemplo solo quiero guardar un log del paso del servicio por esta secuencia. Dan clic en la clasificación Core y luego en Log.


Si quieren ver que es cada una de estas opciones pueden dar clic en Help y verán una página donde les explican. En mi caso lo dejare como está y daré clic en Save & Close.

Ahora vamos a definir el endpoint hacia donde debe ser enviado el mensaje, en este caso el servicio de acceso a datos. Nuevamente seleccionamos la opción Inline
Y damos clic en Create.

Como pueden ver hay varios tipos de endpoint, usaré la primera opción dando clic en ella e introduciré el endpoint del servicio de acceso  a datos.

Nuevamente si quieren ver que son cada una de las opciones pueden dar clic en Help. Yo doy Save & Close y listo. Volvemos a la pantalla del paso 2 de 3 y damos Next.

Aquí es casi lo mismo que en la secuencia de entrada. Seleccionaremos la opción “Define inline” para la secuencia de salida, iremos a la categoría Core y seleccionaremos el mediador Send, que es para que nos envíe el mensaje al endpoint antes definido.



Aquí no tenemos que especificar un endpoint por eso dejamos marcada la opción None.
Damos Save & Close, luego finish y ya tenemos creado nuestro servicio proxy.


Como ven en la imagen anterior el servicio aparece marcado como proxy, nos dice que es inseguro, nos da acceso a los WSDL 1.1 y 2.0, podemos probar el servicio, y también podemos entrar a editarlo ya sea a través de la interfaz gráfica anterior o usando la vista de código fuente. Quiero mostrarles como se ve el servicio así que selecciono esta última opción:



Salimos de ahí dando clic en Cancel y vamos a la opción Try it.

Como pueden ver se muestran las mismas operaciones del servicio de acceso a dato y podemos hacer las mismas cosas. Los invito a probarlo.

Si van a la consola del ESB verán los mensajes de Log que se generan debido al uso del mediador Log en la secuencia de entrada. Pueden editar el servicio proxy y variar sus características y ver como cambie el mensaje de los logs en la consola.


Una vez terminado esto realizaremos el último paso que es asignarle seguridad al servicio web. Volvemos al listado de los servicios y en la fila de nuestro servicio proxy

Daremos clic en Unsecured.
Ya esto lo hemos visto antes así que en la ventana que nos aparece seleccionamos Yes.

Y luego seleccionamos el escenario 1.

Damos clic en Next y seleccionamos los roles que podrán acceder al servicio proxy.
Damos finish y listo. Ya nuestro servicio proxy es seguro.
Ahora verán en su dashboard como solo queda el endpoint que utiliza https.

Lo que hemos hecho es añadirle al WSDL del servicio una política de seguridad como pueden ver a continuación.


Básicamente estamos pidiendo que se use https y se incluya un username token en los mensajes.

Llegado a este punto el servicio está configurado correctamente pero cuando pruebo nuevamente la funcionalidad del try it introduciendo mi usuario y contraseña curiosamente no funciona. Cosas del opensource. Puede ser que la funcionalidad del try it esté rota en la versión 4.6.0 del ESB. Pero esto solo me da pie a usar otra herramienta para probar el servicio: el SOAPUI.

Como no era objetivo de esta entrada introducir esta herramienta no lo haré pero si les dejaré las pantallas de las pruebas y en otra entrada explicaré como usarla.

Luego de creado el proyecto en SOAPUI vemos lo siguiente si intentamos consumir el servicio.


Nos está diciendo que faltan los encabezados de seguridad. Luego de configurarlos vemos lo siguiente:



Ya aquí pueden ver que luego de configurado el proyecto podemos consumir el servicio sin problema confirmándonos que el teníamos un problema con el Try it del ESB.

20 comentarios:

  1. Saludos Jorge.

    Veo que has avanzado en el tema de wso2, quisiera saber si has probado el ejemplo de Retail Banking Sample donde intenran integrar varios de los servidores wso2. he intentado desarrollar el ejercicio pero siempre se me presentan errores.

    ResponderEliminar
    Respuestas
    1. Epale camico, se que es muy tarde, pero has conseguido correr el ejemplo con la versión 3.6. Creo que tiene un bug por lo que he leido, pero no estoy seguro. quisiera saber si tu lo has podido ejecutar y probar perfectamente.

      Eliminar
    2. la versión 3.6 de que herramienta, yo uso el AS y el ESB? si puedes aclarar a que bug o error te refieres sería genial.

      Eliminar
  2. También quería preguntar era como funcionaba la gestión de seguridad en la suite.

    ResponderEliminar
  3. Hola @camilo, gracias por la pregunta.
    Podrías compartir los errores que te dan y así los analizaría y podría darte una respuesta concreta. Esos ejemplos si me han funcionado lo que en esta última versión no los he probado.

    ResponderEliminar
  4. Sobre la gestión de la seguridad creo que hay que determinar a que nivel te refieres. Si es a nivel de servicio pues soporta tanto seguridad a nivel de transporte como a nivel de mensaje contando si no recuerdo mal con 16 escenarios de seguridad que abarcan casi todas las combinaciones posibles. La combinación del ESB con el IS da toda la potencia que necesitamos para la seguridad.

    ResponderEliminar
  5. Cordial saludo,

    Excelente tutorial, estoy implementando un ESB consumiendo un web service creado con Data Services Server, sigo al pie de la letra tus indicaciones pero al momento de probarlo no esta exponiendo las operaciones del web service, tengo que agregar un paso adicional o necesariamente debe hacerse con Application Server, de antemano muchas gracias por la ayuda.

    ResponderEliminar
  6. @Julio Andres, en esos casos lo que pasa es que el servicio proxy no está tomando el WSDL del servicio backend, si puedes mandame el xml del servicio proxy para revisarlo a ver. pero siempre que me ha pasado lo que comentas es porque no se le especificó el WSDL del servicio backend. saludos.

    ResponderEliminar
  7. @Jorge Estoy siguiendo tus tutoriales pero en este ejemplo al tratar de correr Aplication Server y ESB entran en conflicto. Cambie los puertos en el archivo "wso2esb-4.8.1 enterprise server bus\wso2esb-4.8.1\repository\conf\tomcat\catalina-server.xml" y a pesar que si corren en puertos diferentes a la hora de correr el WS y llamarlo desde ESB en Server Aplication se cae.

    Como se puede correr varios server WSO2 en el mismo PC???

    ResponderEliminar
  8. Debes ir al fichero [ESB_HOME]\repository\conf\carbon.xml y cambiar el valor del Offset.

    Puedes ponerle el que quieras, porque lo que hace es por ejemplo si pones 1 le suma ese 1 a todos los demás valores de los puertos. De esta manera puedes tener tantas herramientas como quieras corriendo en un mismo servidor.

    ResponderEliminar
  9. Hola excelente tutorial pero noh epodido configurar un proxy basado en servicio web. laprecer el puerto del servicio web tiene un proxy en reversa. He probado con figurarlo de varias formas y no funciona. Sabes que se puede hacer en ese caso?

    ResponderEliminar
  10. @joracab si puedes facilidar los logs del error que te da en el ESB o en el servicio backend te podré ayudar, así de momento ni idea.

    Mi sugerencia es:
    1. trata de consumir primero el servicio de forma directa o sea sin el ESB. Si te funciona ya sabes que no es por un reverse proxy.
    2. si el punto 1 pasa sin problema consume entonces el servicio usando un servici proxy en el esb sin seguridad.
    3. si el punto 2 pasa sin problema agregale la seguridad al servicio proxy en el ESB.

    De esta manera sabrás con claridad donde está el problema en cuestión y a que se debe.

    ResponderEliminar
  11. Gracias por la respuesta. al hacer las pruebas por las consolas del tryit aparece este mensaje
    The endpoint reference (EPR) for the Operation not found is /services/acueductoBasedProxy/acueductoBasedProxyHttpsSoap11Endpoint and the WSA Action = null. If this EPR was previously reachable, please contact the server administrator.

    ResponderEliminar
    Respuestas
    1. verifica en el WSDL del servicio original, que tenga soapAction En sus operaciones.

      En caso de no tenerlo hay que adicionarlo


      Si es un servicio propio, verifica que en el tag @WebMethod tenga lleno el valor action, en caso de no tenerlo hay que colocarlo y diligenciarlo

      Ejemplo: @WebMethod(action = "hello", operationName = "hello")

      Y cuando vuelvas a compilar la aplicacion el servicio ya deberia consumirse correctamente.

      Cordial Saludo

      Eliminar
  12. no me indicas en que paso de los que te dije te da ese error...yo prefiero probar con el soapui para consumir el servicio, el tryit a veces da sus problemas...

    si me mandas por correo el WSDL del servicio y los mensajes intercambiados (request/response) te podré ayudar.

    ResponderEliminar
  13. por el endpoint veo que el problema esta en el proxy, postea el xml del proxy porque algo tienes mal configurado.

    ResponderEliminar
    Respuestas
    1. Hola,
      Este es el XMl del source view

      /////proxy xmlns="http://ws.apache.org/ns/synapse" name="acueductoBasedProxy" transports="https,http" statistics="enable" trace="enable" startOnLoad="true"





      wsdl service="SCVirtualService" port="SCVirtualServicePort" uri="http://www.acueducto.com.co/waspro/SCVirtual/SCVirtualService/"/>
      endpoint
      target
      publishWSDL uri="http://www.acueducto.com.co/waspro/SCVirtual/SCVirtualService/WEB-INF/wsdl/SCVirtualService.wsdl"
      description/
      proxy
      ////////

      Aparece sin etiquetas por que al postear no las recibe

      Eliminar
  14. hola jorge, gracias por la informacion. cuales tu correo para enviarte esa informacion

    ResponderEliminar
  15. Hola,
    Este es el XMl del source view














    ResponderEliminar
  16. Hola
    ¿que función tengo que activar si en donde dice unsecure no puedo dar click para agregarle seguridad al servicio?

    ResponderEliminar