Configuración de SSO con Keycloak
Antes de configurar SSO, asegúrese de que el parámetro APP_URL en config.env coincida con el dominio actual de Passwork, por ejemplo — APP_URL=https://passwork.example.com
Esto es necesario para que el IDP pueda descargar los metadata. Además, el servidor de Passwork debe operar a través del protocolo HTTPS.
Los siguientes nombres de servidor se utilizan como ejemplos:
- Proveedor (IDP) — keycloack.passwork.local
- Servidor de Passwork (SP) — passwork.example.com
Creación de una aplicación mediante la importación de un archivo en Keycloak
Obtenga y edite el archivo para crear una aplicación en el lado del IDP.
keycloack.json
- json
"clientId": "https://your_host/api/v1/sso/metadata",
"adminUrl": "https://your_host/api/v1/sso/acs",
"baseUrl": "https://your_host/*",
"saml.logout.url": "https://your_host/api/v1/sso/sls"
Abra la interfaz web de Keycloak y vaya a — Clients → Import client:

Realice las siguientes acciones:
- Importe el archivo de aplicación modificado;
- Establezca el nombre de la aplicación que se está creando;
- Desactive — Encrypt assertions;
- Desactive — Client signature required.
Guarde los cambios realizados:

Si es necesario, puede cambiar el identificador único de usuario (NameID) dentro de la aserción SAML después de guardar los pasos anteriores:

Recomendamos especificar username o email, dependiendo del valor elegido, el inicio de sesión del usuario en Passwork puede tener los siguientes formatos:
- username
- [email protected]
Configuración de la transmisión de roles de usuario en la aserción SAML
Vaya y cree un conjunto de configuraciones común para la aplicación (SP) — Client scopes → Create client scope:

Realice las siguientes acciones:
- Establezca el nombre;
- Type — Default;
- Protocol — SAML.

Abra la pestaña Mappers y cree aserciones de atributos para transmitir atributos adicionales del usuario desde Keycloak (IDP) a Passwork (SP):
- Adición de una aserción para transmitir email:
- Add predefined mapper → X500 email;
- Abra la aserción añadida desde la plantilla y cambie:
- SAML Attribute Name — email;
- SAML Attribute NameFormat — Basic.
- Adición de una aserción para transmitir firstName:
- Add mapper → From predefined mappers → X500 surname;
- Abra la aserción añadida desde la plantilla y cambie:
- Property — firstName;
- SAML Attribute Name — firstName;
- SAML Attribute NameFormat — Basic.

Asigne el conjunto de configuraciones creado (Client scope) a la aplicación creada (SP) — Clients → Passwork → vaya a la pestaña Client scopes → Add client scope:

Seleccione el conjunto creado passwork_client_scope de la lista con Assigned type — Default:

Elimine la plantilla de configuración añadida por defecto — role_list:

Configuración y completar los parámetros de Single Sign-On (SSO) en Passwork
Completar los valores de «User Attributes»
Inicie sesión en la interfaz web de Passwork, vaya a — Settings and Users → SSO Settings y complete los atributos de mapeo:
- Email attribute — email;
- Full name attribute — firstName.
Completar los valores de «Identity Provider → Passwork»
Abra la configuración del proveedor de servicios (IDP) — Realm settings → General → Endpoints:

Copie los siguientes valores de parámetros:
- xml
entityID="https://keycloack.passwork.local/realms/master"
<md:SingleLogoutService Location="https://keycloack.passwork.local/realms/master/protocol/saml"/>
<md:SingleSignOnService Location="https://keycloack.passwork.local/realms/master/protocol/saml"/>
Ejemplo de salida xml

Abra — Settings and Users → SSO Settings y complete los valores:
- Identifier (Entity ID) — https://keycloack.passwork.local/realms/master
- Login URL — https://keycloack.passwork.local/realms/master/protocol/saml
- Logout URL — https://keycloack.passwork.local/realms/master/protocol/saml
Completar el valor de «Certificate»
Abra y copie el certificado SSL generado en formato base64 — Realm settings → Keys → Certificate:

Pegue el certificado SSL copiado en el campo correspondiente — Settings and Users → SSO Settings.
Abra la ventana de inicio de sesión en la interfaz web de Passwork e inicie sesión a través de SSO para verificar la configuración correcta:

Posibles errores
Si ocurren errores, se encontrarán en el archivo de registro de PHP
La respuesta SSO no puede descifrarse correctamente porque la huella digital del certificado se copió incorrectamente o es la huella digital del certificado incorrecto:
OneLogin_Saml2_Error: invalid_response LastErrorReason: Signature validation failed. SAML Response rejected in /var/www/app/modules/Admin/SSO/SsoController.php:78\nStack trace:\n#0 [internal function]: Passwork\\Modules\\Admin\\SSO\\SsoController->acsAction()\n#1 [internal function]: Phalcon\\Dispatcher\\AbstractDispatcher->callActionMethod()\n#2 [internal function]:Phalcon\\Dispatcher\\AbstractDispatcher->dispatch()\n#3 /var/www/public/index.php(91): Phalcon\\Mvc\\Application->handle()\n#4 {main}
El valor actual del host en el parámetro APP_URL del archivo config.env es incorrecto:
OneLogin_Saml2_Error: Invalid array settings: sp_acs_url_invalid, sp_sls_url_invalid in /var/www/app/vendors/php-saml/lib/Saml2/Settings.php:122\nStack trace:\n#0 /var/www/app/vendors/php-saml/lib/Saml2/Auth.php(152): OneLogin_Saml2_Settings->__construct()\n#1 /var/www/app/modules/Admin/SSO/SsoService.php(53): OneLogin_Saml2_Auth->__construct()\n#2 /var/www/app/modules/Admin/SSO/SsoController.php(33): Passwork\\Modules\\Admin\\SSO\\SsoService->getAuth()\n#3 [internal function]: Passwork\\Modules\\Admin\\SSO\\SsoController->loginAction()\n#4 [internal function]: Phalcon\\Dispatcher\\AbstractDispatcher->callActionMethod()\n#5 [internal function]: Phalcon\\Dispatcher\\AbstractDispatcher->dispatch()\n#6 /var/www/public/index.php(91): Phalcon\\Mvc\\Application->handle()\n#7 {main}, referer:
Al usuario le falta el atributo utilizado para el inicio de sesión:
OneLogin_Saml2_Error: invalid_response LastErrorReason: The status code of the Response was not Success,was Responder -> urn:oasis:names:tc:SAML:2.0:status:InvalidNameIDPolicy in /var/www/app/modules/Admin/SSO/SsoController.php:78\nStack trace:\n#0 [internal function]:Passwork\\Modules\\Admin\\SSO\\SsoController->acsAction()\n#1 [internal function]: Phalcon\\Dispatcher\\AbstractDispatcher->callActionMethod()\n#2 [internal function]:Phalcon\\Dispatcher\\AbstractDispatcher->dispatch()\n#3 /var/www/public/index.php(91): Phalcon\\Mvc\\Application->handle()\n#4 {main}