Skip to main content

Ejemplo de Implementación App to App

En este ejemplo, queremos añadir un paso adicional en nuestro browser flow que permita autenticar la app del Cliente cuando el usuario ya haya iniciado sesión en la app del PCP y posea el payload de sesión del servicio de usuarios del PCP. Este payload se envía a este nuevo paso, que lo valida y redirige al usuario de vuelta a la app del Cliente.

Nota: Si no se envía el nuevo parámetro, se utilizará la vinculación App to Web.

Para implementar esta estrategia, se añadirá un SPI en el servicio de autenticación y autorización, permitiendo la integración de esta nueva funcionalidad.

Repositorio de Ejemplo

A continuación, se presenta un ejemplo del SPI en Java, que se integrará al servicio para implementar la estrategia de App to App. Puedes revisarlo en el siguiente repositorio: Keycloak Authentication SPI. Además, en el mismo repositorio, encontrarás una representación ficticia del backend del PCP. Este backend interactúa con la app del PCP y el servicio de autenticación y autorización a través del SPI que vamos a integrar.

Integración con el Servicio de Autorización

Una vez descargado el repositorio, ejecuta el comando make all para levantar el servicio de autenticación y autorización y el backend del PCP. Luego, dirígete al navegador web y accede a http://localhost:9090/admin/ para iniciar sesión con las credenciales de administrador. A partir de aquí, sigue estos pasos:

Crear un Nuevo Realm

  1. Inicia sesión en el Admin de Keycloak (las credenciales están en el compose.yaml en el directorio raíz del proyecto de ejemplo).
  2. Navega a la sección de Realms.
  3. Haz clic en "Create Realm".
  4. Define un nombre para el nuevo realm (por ejemplo, “Banco MODO”).
  5. Guarda los cambios para crear el realm.
  6. Dirígete a la sección "Realm settings > Login".
  7. Deshabilita el login con email.
  8. Ve a "Realm settings > User profile".
  9. Deja solo los atributos username y email.
  10. Edita el campo email y deshabilita el campo ‘Required field’.
  11. Guarda los cambios.

Crear un Nuevo Browser Flow y Añadir el SPI

  1. Dentro de la sección "Authentication" del realm en Keycloak, crea un nuevo flujo de autenticación utilizando como base el Browser Flow por defecto.
  2. Nombra este nuevo browser flow “Browser + SPI Custom”.
  3. Añade un nuevo step cuyo tipo sea igual al que definimos en nuestro SPI. En el ejemplo compartido, este step se llama Validate Session Authenticator.
  4. Posiciona este step como el primer step y en requirement elige la opción ‘alternative’.
  5. Guarda los cambios.

Crear un Usuario de Prueba

  1. Ve a "Users".
  2. Haz clic en "Add User".
  3. Proporciona la información requerida para el usuario de prueba.
  4. Guarda los cambios.

Crear un Cliente de Prueba

  1. Una vez creado el usuario, dirígete a "Clients".
  2. Haz clic en "Create client" para añadir un nuevo cliente.
  3. Proporciona la información requerida y haz clic en "Next".
  4. En la sección ‘Capability config’ deshabilita el ‘Direct access grants’ y haz clic en "Next".
  5. En la sección ‘Login settings’, configura la URL del campo ‘valid redirect URLs'.
  6. Guarda los cambios.

Probar la Demo

Una vez levantado el proyecto, procede a crear un usuario en este servicio hipotético que registrará y logueará al usuario de prueba.

curl --location 'http://localhost:9091/login' \
--header 'Content-Type: application/json' \
--data '{
"username": "myuser",
"password": "1234"
}'

El servicio retornará el payload de la sesión que creará el backend del PCP:

{
"session": "09c393f1-0475-4e14-a0b2-acb236f093ce"
}

Esta sesión será utilizada para realizar la prueba por la vía App to App.

A continuación, se muestra un ejemplo de cURL del url_login con el que el usuario realizará el consentimiento:

curl --location 'http://localhost:9090/realms/Banco%20MODO/protocol/openid-connect/auth?client_id=00999&redirect_uri=walletapp%3A%2F%2Fcallback&response_type=code&session=09c393f1-0475-4e14-a0b2-acb236f093ce'

En caso de que no se envíe el campo session, el flujo redirigirá a la vinculación App to Web.