Cliente de un servicio REST autenticado con OAuth en Java

Publicado por pico.dev el .
blog-stack java planeta-codigo programacion
Comentarios

Teniendo un servicio REST securizado con OAuth2 al invocarlo deberemos realizar el flujo necesario para obtener un access token y posteriormente enviarlo al servicio REST como forma de autenticación y autorización. Usando un cliente programado en el lenguaje Java y usando la librería HttpClient podemos hacer las peticiones HTTP necesarias para la invocación del servicio.

Java

Explicaba como llamar a un servicio REST autenticado con OAuth2 en el artículo autenticación con OAuth y Keycloak en un servicio REST con JAX-RS y Spring Boot. Para ello usaba la utilidad curl para hacer las peticiones HTTP get y post necesarias tanto para obtener el access token usando el flujo client_credentials como para una vez obtenido el access token llamar al servicio REST. En una aplicación usaremos un lenguaje de programación para llmar al servicio, en este ejemplo mostraré como llamarlo usando un cliente programado en lenguaje Java que hará las mismas peticiones get y post pero usando la librería HttComponents en vez de curl.

Primero añadiremos como dependencia del proyecto la librería HttComponents. Como en las diferentes llamadas el intercambio de datos se realiza mediante el formato JSON añadiremos otro par dependencias para procesar los datos en este formato, en este caso usando la API de JSON-P y una implementación.

Este sencillo cliente realiza varias peticiones get y post. Una para obtener la configuración de los endpoints, el que nos interesa es el de obtener un access token, otra petición para obtener el access token y finalmente con el access token invocar al servicio mediante otra petición.

Iniciado Keycloak con Docker, configurado el realm y creado un cliente junto con un rol e iniciado el servicio REST podemos ejecutar el cliente que invoque al servicio. El resultado de las trazas que obtendremos en la terminal será el siguiente.

En las trazas vemos el endpoint para obtener access token, el access token obtenido, refresh token y tiempos de expiración de los mismos, finalmente los datos devueltos por el servicio. Como se observa los access token son una cadena opaca bastante larga de caracteres, y es que está cifrada, firmada digitalmente y contiene información como el rol y tiempos de expiración. Enviado el access token al servicio REST el adaptador de Keycloak para Spring Boot validará la firma digital del token, descifrará la información, validará su tiempo de expiración y se comprobará si tiene el rol necesario para acceder al endpoint del servicio REST. Notar que con la información incluida en el token y el hecho de que está firmado digitalmente no es necesario que el servicio REST se comunique con el proveedor de OAuth para hacer la validación.

El cliente no tiene más salvo que usando la clase HttpClient y haciendo una petición HTTPS con un certificado autofirmado en el servidor deberemos ignorar las comprobaciones de seguridad. Para ello se usan un SSLConnectionSocketFactory que las ignore.

Un buen libro sobre OAuth que he leído es Mastering OAuth 2.0 que explica detalladamente el protocolo OAuth junto con el resto de formas de obtener un token además del mostrado en este artículo usando las credenciales del cliente.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub.

Yo apoyo al software libre