---
title: "Integración de SAML2"
canonical: "https://onesaitplatform-es.refined.site/space/OP/1786052626/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://aa62ebc5-6dcd-4e73-babc-ae30395ce41b)

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://8dfa6a8a-bdc0-4ff3-88de-ceb68ceab6a2)

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://17f622bd-38c2-4fd9-9ab3-d3eff17a843a)

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://38a3248e-e7f1-46a2-b053-23726645873d)

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://92e9db11-4264-48a7-a595-936c21aacd95)

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

![image](media://ef58201b-44dd-4d62-8053-e89847a0203f)


### 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://fc40067a-3e9b-4754-b112-43c825b9d3ab)

Le damos un alias y hacemos click en “save”

![image](media://79cf8e63-5dc1-4c0a-9f28-cdd46cc8b195)

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

![image](media://2dcb00a5-4bb2-4978-83b9-11ab5fb1efb6)

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

![image](media://41af4805-e568-4edf-9664-f2234d5eb451)

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://de990f1d-1892-4a73-8877-2384635f4efa)

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://65c172bc-50ca-4960-b1fd-ee0d6ed50e30)

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://4bdea4ed-d676-408e-a10d-30f519f8a459)

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://44e39aa5-8bd0-4865-832e-8626af06b17a)

Token obtenido tras el login:

![image](media://d72261cf-0270-4534-9ed2-3572e2063334)

## 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://5b257eb5-3b12-419e-a43e-ecf759879509)

## Esquema de autenticación con SAML 


![image](media://7390ef2a-17aa-4d82-b94e-43f052803b12)