MicroProfile y JWT


En esta ocasión utilizaremos MicroProfile Starter para generar un proyecto maven que nos permitirá usar MicroProfile junto a JWT. También utilizaremos Keycloak como nuestro proveedor de JWT (previamente configurado acá con usuarios y roles) y KumuluzEE como framework.

Generar el Proyecto

  • Lo primero es ingresar al página de MicroProfile Starter y escribir el groupId, artifactId, seleccionar la versión 2.1 del MicroProfile Version y la especificacion JWT Auth. Para la elección del MicroProfile Server he elegido KumuluzEE, es solo una elección personal, desde que lo descubrí me ha gustado mucho, nada en contra de las demás implementaciones 😇:
 

  • Al finalizar presionamos Download, obtenemos el zip, lo descomprimimos, lo abrimos con nuestro IDE favorito y tendremos nuestra base del proyecto autogenerada (los paquetes de test los eliminé para generar otros que se integran con Keycloak utilizando Arquillian):


Configurarlo para que utilice nuestro Keycloak


  • De las clases generadas buscamos la que extiende Application, tenemos que definir los roles que utilizaremos en DeclareRoles. En nuestro caso tenemos uno que se llama administracion:

   
  • Luego en la clase ProtectedController definimos que rol es el que podrá ejecutar el método en RolesAllowed (administracion), también agregamos nuestra clave personalizada (atributo-clave):

 
  
  • Ahora tenemos que modificar el archivo config.yaml para que quede de la siguiente forma:
 

 
  • La linea 9 contiene la clave pública que nos entrega el Realm MicroProfile creado en Keycloak
  • En la linea 10 está definida la url de nuestro proveedor del Realm

Generar Aplicación


  • Ahora podemos crear el JAR y lanzarlo:
    mvn clean package
    java -jar target/kumjwt.jar
    
  • Intentamos acceder a nuestro recurso público y nos responde en forma correcta:
    curl http://localhost:8080/data/hello
    Hello World
    
  • Al recurso privado:
    curl http://localhost:8080/data/protected
    
  • La respuesta del recurso privada es un mensaje de error:
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
    <title>Error 401 Unauthorized</title>
    </head>
    <body><h2>HTTP ERROR 401</h2>
    <p>Problem accessing /data/protected. Reason:
    <pre>    Unauthorized</pre></p><hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.14.v20181114</a><hr/>
    
    </body>
    </html>
    
  • Para corregirlo obtenemos el token (indicado acá, access_token) y utilizamos Bearer Authentication:
    curl --header "Authorization: Bearer eyJhbGciOiJSU...Uw" http://localhost:8080/data/protected
    
    • Junto a Bearer se incluye el token que por espacio está incompleto (le agregue el ...)
  • Y obtenemos:
    Protected Resource; Custom value : valor asociado a la clave
    
Finalmente pudimos acceder a nuestro recurso protegido y podemos ver el valor del atributo que definimos en el usuario 😁

Algunas notas:
  • Los test que vienen del archivo descargado los eliminé.
  • Es necesario que este corriendo Keycloak.
  • Agregué test utilizando Jersey Test.
  • El test que utiliza la validación del token esta hecho con Arquillian.
  • La integración con otros MicroProfile Server debe ser similar 😨.

El código está disponible en GitHub ✌.



No hay comentarios.:

Publicar un comentario