Lab002 - Configuración de oauth2 endpoint
En esta practica, realizaremos las configuraciones necesarias para el acceso a los endpoints de nuestro realm, configurados en la práctica anterior de configuración del Keycloak. Recordando que la información de nuestro realm sera la siguiente:
- realm: labs
- clientId: consumidor_autorizado_oauth
- clientSecret:
- user: userdemo
- password: Pass1234
Y con esta información, comenzamos.
1. Despliegue del Xposer Server.
1.1 Descargar el Helm Chart necesario para realizar la practica desde el siguiente enlace:
1.2. Realizar el despliegue y configuraciones iniciales como se hizo en la practica 001.
1.2.1 Ambientar kubernetes con los siguientes comandos:
kubectl config current-context
docker context ls
docker context use default
1.2.2 Crear la credencial de AWS para descargar la imagen desde el ECR
kubectl create secret docker-registry aws-ecr-credentials --docker-server=735877081960.dkr.ecr.us-east-1.amazonaws.com --docker-username=AWS --docker-password="$(aws ecr get-login-password --region us-east-1)" --namespace default
1.2.3. Crear los secrets de los certificados para el xposer-server con el siguiente comando:
cd certs
kubectl create secret generic xposer-certs-secrets --from-file=rootCA.pem=rootCA.pem --from-file=xposer.key=xposer.key --from-file=xposer.pem=xposer.pem --namespace default
1.2.4. Crear el secreto para el ADMIN_APIKEY para poder consumir los servicios administrativos del Xposer Server. Para este ejercicio, utilizaremos como apikey el valor de MIAPIKEYPRIV, teniendo en cuenta que esta llave es sensible a Mayúsculas y minúsculas.
kubectl create secret generic xposer-environment-secrets --from-literal=ADMIN_APIKEY=MIAPIKEYPRIV --namespace default
1.2.5. Instalar el chart ejecutando el siguiente comando:
helm install xposer-demo .\xposer-server-latest.tgz
d 1.2.6. Verificar que el pod se desplegó y que esta ejecutándose:
kubectl get pods
1.2.7. Verificar que el pod este saludable:
kubectl describe pod xposer-demo-xposer-server-<identificador>
1.2.8. Abrir el swagger-ui del xposer:
https://localhost:8443/xposer-admin/v1/docs
Con lo que se desplegara la interfaz de swagger ui integrada al Xposer.

1.3. Abrir Postman y crear una petición para configurar los siguientes artefactos:
- Servicio (server)
- Ruta (route)
- Regla (rule)
Los procesos de creación de estos artefactos, se explicaran en las secciones siguientes de esta guía.
2. Creación del Servicio (server) en el Xposer Server.
2.1 Abrir el swagger-ui incluido con el Xposer Server entrando a la siguiente dirección:
https://localhost:8443/xposer-admin/v1/docs
2.2. Presionar el botón Authorize de la interfaz del swagger-ui para introducir el API Key:

2.3. Introducir el Apikey en el dialogo y presionar Authorize una vez ofuscada la llave, presionar el botón Close:


2.4. Buscar en la sección de Xposer Admin SERVER, el método POST, y presionar el botón
:

2.5. En la sección de body, colocar el siguiente payload:
{
"name": "OAUTH2_SERVER_KEYCLOAK",
"url": "http://kubernetes.docker.internal:8080/realms/labs/protocol/openid-connect",
"description": "Servidor de pruebas para generación y validación de tokens",
"id": "server::oauth2::001"
}
2.6. Presionar el botón de
y revisar que la ejecución se haya realizado correctamente.

2.7. Verificar que se ha creado el servidor correctamente, consumiendo el servicio de GET Server By ID. Buscar el método GET con la ruta /xposer-admin/v1/servers/{id}:

2.8. Presionar el botón
y en el campo de id, colocar el valor server::oauth2::001

2.9. Presionar el botón de
como se muestra en la imagen y como podemos observar, se retorna el server que acabamos de crear:

3. Creación de la Ruta (route) en el Xposer Server.
3.1. Abrir el swagger-ui incluido con el Xposer Server entrando a la siguiente dirección:
https://localhost:8443/xposer-admin/v1/docs
3.2. Presionar el botón Authorize de la interfaz del swagger-ui para introducir el API Key:

3.3. Introducir el Apikey en el dialogo y presionar Authorize una vez ofuscada la llave, presionar el botón Close:


3.4. Buscar en la sección de Xposer Admin ROUTE, el método POST, y presionar el botón
:

3.5. En la sección de body, colocar el siguiente payload:
{
"url": "/labs/oauth/v2/*",
"prefix": "/labs/oauth/v2",
"name": "solicitud de tokens y validación de usuario",
"tags": ["seguridad"],
"enabled": true,
"methods": {
"GET": {
"schema": {
"summary": "Método para obtener información del usuario",
"tags": ["OpenID Connect"],
"headers": {
"type": "object",
"properties": {
"authorization": {
"type": "string"
}
},
"required": ["authorization"]
}
}
},
"PUT": {},
"HEAD": {},
"POST": {
"schema": {
"summary": "Creación de nuevo objeto",
"tags": ["OpenID Connect"],
"consumes": ["application/x-www-form-urlencoded"],
"body": {
"type": "object",
"properties": {
"client_id": {
"type": "string"
},
"client_secret": {
"type": "string"
},
"client_id": {
"type": "string"
},
"grant_type": {
"type": "string"
},
"scope": {
"type": "string"
},
"username": {
"type": "string"
},
"password": {
"type": "string"
},
"otp": {
"type": "string"
},
"refresh_token": {
"type": "string"
}
}
},
"description": "Método POST de pruebas"
}
},
"PATCH": {},
"DELETE": {}
},
"metadata": {},
"description": "Métodos para obtener tokens y validarlos desde keycloak",
"id": "route::oauth2::001"
}
3.6. Presionar el botón de
y revisar que la ejecución se haya realizado correctamente.

3.7. Verificar que se ha creado la ruta correctamente, consumiendo el servicio de GET Route By ID. Buscar el método GET con la ruta /xposer-admin/v1/routes/{id}:

3.8. Presionar el botón
y en el campo de id, colocar el valor route::oauth2::001

3.9. Presionar el botón de
como se muestra en la imagen y como podemos observar, se retorna el server que acabamos de crear:

4. Creación de la Regla (rule) en el Xposer Server.
4.1. Abrir el swagger-ui incluido con el Xposer Server entrando a la siguiente dirección:
https://localhost:8443/xposer-admin/v1/docs
4.2. Presionar el botón Authorize de la interfaz del swagger-ui para introducir el API Key:

4.3. Introducir el Apikey en el dialogo y presionar Authorize una vez ofuscada la llave, presionar el botón Close:


4.4. Buscar en la sección de Xposer Admin RULE, el método POST, y presionar el botón
:

4.5. En la sección de body, colocar el siguiente payload:
{
"name": "rule::security::token",
"server": "server::oauth2::001",
"description": "Regla de Servidor de consumo de OAuth2 API",
"groups": [],
"consumers": [],
"authorizationType": "none",
"route": "route::oauth2::001",
"id": "rule::securitytoken::001"
}
4.6. Presionar el botón de
y revisar que la ejecución se haya realizado correctamente.

4.7. Verificar que se ha creado la ruta correctamente, consumiendo el servicio de GET Rule By ID. Buscar el método GET con la ruta /xposer-admin/v1/rules/{id}:

4.8. Presionar el botón
y en el campo de id, colocar el valor rule::securitytoken::001

4.9. Presionar el botón de
como se muestra en la imagen y como podemos observar, se retorna el server que acabamos de crear:

5. Pruebas de generación y validación de tokens.
Una vez completamos las secciones anteriores, podemos verificar desde la misma pagina de documentación de la api del xposer, que aparecen una sección nueva que dice OpenID Connect, en donde podemos observar los siguientes dos métodos:

A continuación ejecutaremos operaciones para lograr obtener tokens y validarlos mediante estos servicios.
5.1. Seleccionar la llamada por el método POST de /labs/oauth/v2/{*}

5.2. Colocar la siguiente información en el formulario para realizar la petición:
- client_id: consumidor_autorizado_oauth
- client_secret: [[EL-SECRET-QUE-GENERARON]]
- grant_type: password
- scope: openid email
- username: userdemo
- password: Pass1234
5.3. Verificación de la respuesta, donde obtenemos access_token, refresh_token, caducidad, etc.

5.4. Copiar el access_token, y mediante el método GET de la sección de OpenId Connect, colocar en el formulario lo siguiente:
- authorization: Bearer [[El token copiado]]
- *: userinfo
Así como se muestra en la siguiente imagen:

5.5. Revisar la respuesta obtenida, lo que nos confirmara que el token es valido.

5.6. Si esperamos unos segundos, podremos obtener el mensaje de error de Unauthorized, debido a que el token a caducado, y a pasado mas de los 300 segundos que tiene como limite de caducidad. Ejecutamos nuevamente el servicio de GET con los mismo parámetros, y obtendremos la siguiente respuesta:

Con esto concluimos nuestro laboratorio 2.