Artículo
· 22 feb, 2023 Lectura de 3 min

Como publicar un webservice rest con autenticación

Hace unos días, publique una pregunta respecto a este tema pero la respuesta era algo mas compleja de lo que esperaba, así que para futura referencia de otras personas que tengan la misma duda he preferido documentar el proceso en un articulo. 

La premisa era la siguiente, hemos comenzado a utilizar el paquete Restforms2 para tener una api CRUD que nos permita almacenar y consultar datos en la base de datos de IRIS. Pero esto no nos permite hacer todo lo que necesitamos, ni aun empleando custom querys. Por lo tanto necesitábamos emplear métodos personalizados implementados en una integración. El problema de esto como ya podéis imaginar es que si empleamos un servicio que extiende de Enslib.REST.Service este no tendrá autenticación.

La solución a esto, como bien me indicaron, es aprovechar la opción de las aplicaciones CSP para utilizar la autenticación básica con los usuarios y contraseñas del propio portal de IRIS.

Sin embargo, esto requiere un pequeño cambio en el planteamiento. Para poder aprovechar esto, deberemos crear un servicio genérico, en lugar de un servicio rest, el cual invocaremos desde la aplicación CSP pero no será accesible de ninguna otra manera, es decir, no dejaremos expuesto el mismo servicio sin autenticación en otro puerto. 

Para este ejemplo he creado una operación "Demo" con un método que devuelve un saludo en función del idioma y el servicio que acabo de comentar que deberemos crear será tal que así. Lo añadiremos a la producción y de ahora en adelante, asumiremos que lo hemos llamado "ProxyService".



Una vez creado este servicio, lo invocaremos desde una aplicación CSP. Para ello haremos uso del método "CreateBusinessService" de la clase "Ens.Director" 

Esto nos devuelve una instancia del servicio en la variable "bs" gracias a la cual podríamos invocar el método del servicio que hemos creado de una forma similar a la siguiente. Esto supondría que tendríamos que manejar a mano los parámetros de la petición REST y es algo repetitivo.

 

Es por esto que para simplificar la asignación de los parámetros de la url y el contenido del cuerpo de la petición he implementado la siguiente clase. 

De este modo, crear la aplicación CSP que publique dichos métodos rest autenticados sería tan simple como crear una clase que extienda de la anterior, definir los métodos que queremos publicar, y asignar las rutas correspondientes. El cuerpo de cada una de las funciones a publicar contendría una única línea como en el ejemplo siguiente. 



Gracias al método que hemos implementado en la clase "csp.Base" todos los parámetros de la url que coincidan en nombre con las propiedades del mensaje de petición se asignarán automáticamente. Y si pasamos en el último parámetro de la llamada el nombre de una propiedad del mensaje, se asignara el contenido de la petición a dicha propiedad del mensaje. 

Espero que si hay alguien que tuviese esta misma duda haya quedado resuelta y estos fragmentos de código puedan ayudaros a implementar una solución similar. 
 

Comentarios (3)1
Inicie sesión o regístrese para continuar

Muy ingenioso. Gracias por compartir!

Me ha gustado cómo le sacas partido a las funciones de asignación dinámica tanto de métodos ( $classmethod(clase,metodo)), como de propiedades ( $property(objRef,propName)). Igualmente el utilizar las macros del sistema $$$comMemberNext y $$$cCLASSproperty. 

Como sugerencia, en lugar de utilizar directamente estas macros, quizá ahí sería mejor utilizar el API que ya existe en %SYSTEM.Dictionary. En concreto esa línea podría ser:

set prop = $system.Dictionary.comMemberNext(claseRequest,$$$cCLASSproperty,prop)