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:

Xposer Helm Chart Download

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.

swagger ui xposer interface

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:

xposer swagger-ui auth button

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

apikey request clear

api key request obfuscated

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

try out api server

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 execute button y revisar que la ejecución se haya realizado correctamente.

response server creation 200

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}:

get server by id

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

execution get server by id

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

server by id confirmation

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:

xposer swagger-ui auth button

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

apikey request clear

api key request obfuscated

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

try it out api route

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 execute button y revisar que la ejecución se haya realizado correctamente.

response route creation 200

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}:

get route by id

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

execution get route by id

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

route by id confirmation

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:

xposer swagger-ui auth button

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

apikey request clear

api key request obfuscated

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

try it out api rule

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 execute button y revisar que la ejecución se haya realizado correctamente.

response rule creation 200

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}:

get rule by id section

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

execution get rule by id

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

rule by id confirmation

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:

OpenID Connect Labs Section

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/{*}

post method labs oauth2 call

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.

token response ok from keycloak

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:

get user info

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

token validation response

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:

unauth response token invalid

Con esto concluimos nuestro laboratorio 2.