---
title: "Integración de SAML2"
canonical: "https://onesaitplatform-es.refined.site/space/DOC/2216826128/Integraci%C3%B3n%20de%20SAML2"
format: markdown
---
> ℹ️ Disponible a partir de la versión 3.0-jailbreak


> Macro (toc)


A partir de la versión 3.0-jailbreak de plataforma, es posible utilizar Keycloak como IM avanzado y configurar [Identity Brokering](https://www.keycloak.org/docs/latest/server_admin/index.html#_identity_broker) con un IdP de SAML2.

Esto nos permitirá poder delegar la autenticación en el IdP teniendo a Keycloak como intermediario, para así poder seguir utilizando Oauth2 como estándar de autenticación/autorización en plataforma y aplicaciones que trabajen con la ésta.

## Nota

Aunque se seguirá pudiendo utilizar Oauth y los tokens generados por dicho mecanismo, para la obtención del token solo se podrá usar el [flujo de código de autorización](https://auth0.com/docs/flows/authorization-code-flow). Esto es debido a que, como bien es sabido, SAML2 es un protocolo síncrono que requiere de la participación del navegador en una serie de redirecciones. **Una vez obtenido el token, se podrá utilizar en las cabeceras HTTP de Authorization.**

## Configuración en Keycloak

El primer paso será configurar el identity brokering en Keycloak.

### Identity Provider

Lo primero será dar de alta el servidor IdP SAML2. Para ello tendremos que logarnos en la consola de administración de Keycloak. (p.e. [https://development.onesaitplatform.com/auth/](https://development.onesaitplatform.com/auth/) )

Una vez dentro, iremos al Realm “onesaitplatform” que es el que se usa por defecto si no se utiliza multitenant.

![image](media://d7ab303c-88e2-4696-bef3-b246f61f36f1)

A continuación, nos dirigiremos a la sección “Identity providers” del menú, y añadiremos uno nuevo de tipo “SAML v2.0”:

![image](media://3a34b064-66b0-4dd6-8858-13358dde2e01)

Aquí tendremos que configurar una serie de parámetros relacionados con el IdP que se va a usar. 

*alias → Nombre del IdP configurado (p.e. saml2idp)*

*Single Sign-On Service URL → URL de servicio SSO del IdP (p.e. **[http://localhost:8082/simplesaml/saml2/idp/SSOService.php](http://localhost:8082/simplesaml/saml2/idp/SSOService.php)**)*

*Single Logout Service URL →  URL del servicio de Log Out del IdP (p.e. **[http://localhost:8082/simplesaml/saml2/idp/SingleLogoutService.php](http://localhost:8082/simplesaml/saml2/idp/SingleLogoutService.php)**)*

*Principal Type → Attribute [Name]*

*Principal Attribute → Nombre del atributo SAML donde viene la información del userid único (p.e. uid o sAMAccountName)*

El resto de parámetros los dejaremos por defecto. Le damos al botón de save para guardar la configuración.

![image](media://c6d39bba-0ee0-458f-a918-d4720f71d2ef)

Una vez guardada, vamos a la pestaña de mappers, donde tendremos que añadir todos los atributos que vienen de la SAML assertion y que vamos a importar para después poder mapear con un usuario de plataforma (userid, email, name).

Le damos a “create” para añadir un nuevo atributo.

![image](media://b65f013a-44ab-4610-b840-69a910307945)

A continuación se selecciona Attribute importer y el nombre del atributo a importar (p.e. uid que será el userid del usuario en plataforma)

![image](media://608d573a-451c-4127-8375-8c6a0bb2e6fb)

Repetimos el proceso para email y name, quedándonos 3 mappers definidos:

![image](media://0d08c2f9-ad3a-44dd-8586-8a8781fc2c4a)


### Authentication Flow

Ahora tenemos que crear el flujo para la importación del usuario en el primer log in.

Nos dirigimos a “Authentication” en el menú, y en la misma pestaña “Flows” le damos a “New”:

![image](media://e293cfed-c0ce-4415-8b8f-b2ffbd8ec4d3)

Le damos un alias y hacemos click en “save”

![image](media://97e752ba-6315-42b2-9d08-5c89e28e43d4)

Una vez creado el Flow, nos aparecerá en la lista del combo box de “Flows”.

![image](media://68d3fff5-15d4-4736-b820-60300209700b)

Ahora deberemos darle a “Add execution”. Seleccionamos como provider “Process IdP Login Callbak” y le damos a “save”.

![image](media://afc392c7-648f-4ef1-ac44-efc0b00bed49)

Volveremos a la vista de Flows con la nueva ejecución. En la misma ejecución a la derecha, le damos a “Actions → Config” para configurar la ejecución.

![image](media://c0ccbe43-a3f9-433f-aa60-9e579d8838fa)

Aquí debemos mapear los atributos de plataforma: username, email y fullName con los atributos de SAML que se han importado anteriormente. Además, tenemos un campo “admins whitelist” donde podemos indicar una lista de usuarios separados por comas para asignarles ROLE_ADMINISTRATOR en plataforma.

![image](media://7ec97b74-cfa8-4cb1-ac0b-4eee15e7ed82)

Por último, volvemos a “Identity providers” a través del menú, y seleccionamos el IdP de SAML que creamos en el paso anterior. Buscamos el parámetro de configuración “**First Login Flow” **y seleccionamos el Flujo que acabamos de crear:

![image](media://988bfdd7-16ef-4925-b035-853d668c723e)

Guardamos los cambios.

## Configuración en Service Provider (SP) o aplicativos

Una vez configurado Keycloak, ya solo queda configurar el cliente Oauth que vaya a hacer uso de esta autenticación. 

ClientId y ClientSecret serán: *onesaitplatform*

URL de código de autorización Oauth: https://{HOST}//auth/realms/onesaitplatform/protocol/openid-connect/auth?scope=openid&**kc_idp_hint=saml2idp**

Le añadimos el parámetro **kc_idp_hint=saml2idp** que hace referencia al alias de nuestro SAML2 provider, para que al redirigirnos a Keycloak, éste ya sepa que queremos autenticarnos a través de SAML, y no a través de usuario y contraseña de plataforma.

Una vez levantada la aplicación, cuando se desencadene el flujo de autenticación, se nos redirigirá a IdP para logarnos. Una vez autenticados en el IdP SAML2, se nos devolverá a la aplicación cliente con un token JWT.

A continuación se muestra un ejemplo utilizando un servidor simplesaml como IdP para la demostración.

![image](media://830cef01-95c2-40b5-823e-81729742e4d4)

Token obtenido tras el login:

![image](media://ee0f95ea-acbf-427c-8a37-24f9db2f54d4)

## Configuración extra nginx


```
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header    X-Forwarded-Host $host;
proxy_set_header Host $host;
```

Keycloak ENV VAR:

![image](media://8ef6e656-acb0-422b-abb0-7dae09391dea)

## Esquema de autenticación con SAML 


![image](media://19264f6b-611b-49ad-bcc9-fcf839598f22)