API de SSO Empresarial
El SSO Empresarial (Single Sign-On) permite a los miembros de una organización autenticarse usando el proveedor de identidad existente de su empresa en lugar de un nombre de usuario y contraseña. Auris admite los protocolos SAML 2.0 y OIDC, respaldados internamente por el broker de IdP de Keycloak.
El flujo de SSO funciona de la siguiente manera:
- Un administrador crea una conexión SSO para una organización, proporcionando la configuración de su IdP (metadatos SAML o URL de descubrimiento OIDC).
- El administrador añade y verifica uno o más dominios de correo electrónico (p. ej.,
acme-corp.com) mediante registros DNS TXT. - Una vez activada la conexión, los usuarios con un correo electrónico en un dominio verificado son redirigidos automáticamente al IdP cuando intentan iniciar sesión.
- En el primer inicio de sesión SSO, Auris realiza el aprovisionamiento Just-In-Time (JIT) — creando la cuenta de usuario, vinculándola a la organización y emitiendo tokens de Auris — todo de forma transparente.
Todos los endpoints de SSO para administradores requieren la cabecera x-tenant y un Bearer token válido.
Conexiones SSO
/api/organizations/[orgId]/sso/connectionsRequires: view:sso_connectionsLista todas las conexiones SSO configuradas para una organización. Devuelve metadatos de conexión, tipo, estado y dominios verificados asociados.
Parámetros de consulta
| Parámetro | Tipo | Descripción |
|---|---|---|
page | integer | Número de página (predeterminado: 1) |
limit | integer | Elementos por página (predeterminado: 20) |
Respuesta exitosa
{
"ok": true,
"data": [
{
"id": "sso_abc123",
"type": "saml",
"name": "Acme Corporate IdP",
"status": "ACTIVE",
"keycloakIdpAlias": "acme-saml-abc123",
"domains": ["acme-corp.com", "acme.io"],
"createdAt": "2025-01-20T09:00:00Z",
"updatedAt": "2025-02-01T14:30:00Z"
}
]
}Estados de conexión SSO:
| Estado | Descripción |
|---|---|
PENDING | Conexión creada pero aún no activada |
ACTIVE | Conexión activa — los usuarios con correos de dominio verificado son redirigidos |
DISABLED | Conexión desactivada por un administrador |
ERROR | La conexión encontró un error de configuración durante la comunicación con el IdP |
/api/organizations/[orgId]/sso/connectionsRequires: manage:sso_connectionsCrea una nueva conexión SSO para la organización. Auris registra un Proveedor de Identidad correspondiente en Keycloak y devuelve los metadatos del Proveedor de Servicios necesarios para configurar el IdP en el lado del cliente.
Configuración SAML 2.0
Para SSO basado en SAML, proporciona los metadatos del Proveedor de Identidad. Puedes indicar una metadataUrl (recomendado — Auris la obtendrá y analizará automáticamente) o proporcionar los campos individuales de forma manual.
Cuerpo de la solicitud — SAML con URL de metadatos
{
"type": "saml",
"name": "Acme Corporate SAML",
"config": {
"metadataUrl": "https://idp.acme-corp.com/federationmetadata/2007-06/federationmetadata.xml"
}
}Cuerpo de la solicitud — SAML con configuración manual
{
"type": "saml",
"name": "Acme Corporate SAML",
"config": {
"entityId": "https://idp.acme-corp.com",
"ssoUrl": "https://idp.acme-corp.com/saml2/sso",
"certificate": "-----BEGIN CERTIFICATE-----\nMIIDpDCCAoygAwIBAgIGAX...\n-----END CERTIFICATE-----"
}
}| Campo | Requerido | Descripción |
|---|---|---|
metadataUrl | No | URL a los metadatos SAML XML del IdP. Si se proporciona, entityId, ssoUrl y certificate se extraen automáticamente. |
entityId | Sí* | El Entity ID (Issuer) del IdP. Requerido si no se proporciona metadataUrl. |
ssoUrl | Sí* | La URL del Servicio de Inicio de Sesión Único del IdP (binding HTTP-Redirect). Requerida si no se proporciona metadataUrl. |
certificate | Sí* | El certificado de firma X.509 del IdP en formato PEM. Requerido si no se proporciona metadataUrl. |
Configuración OIDC
Para SSO basado en OIDC, proporciona la URL de descubrimiento y las credenciales del cliente emitidas por el IdP.
Cuerpo de la solicitud — OIDC
{
"type": "oidc",
"name": "Acme OIDC Provider",
"config": {
"discoveryUrl": "https://login.acme-corp.com/.well-known/openid-configuration",
"clientId": "auris-sp-client-id",
"clientSecret": "auris-sp-client-secret"
}
}| Campo | Requerido | Descripción |
|---|---|---|
discoveryUrl | Sí | La URL de Descubrimiento OIDC del IdP. Auris obtiene el authorization_endpoint, el token_endpoint y el jwks_uri desde ella. |
clientId | Sí | El Client ID registrado en el IdP para Auris como parte confiante (relying party). |
clientSecret | Sí | El Client Secret para el registro de la parte confiante. |
Respuesta exitosa
{
"ok": true,
"data": {
"id": "sso_def456",
"type": "saml",
"name": "Acme Corporate SAML",
"status": "PENDING",
"keycloakIdpAlias": "acme-saml-def456",
"acsUrl": "https://api.altovar.net/api/auth/sso/callback",
"entityId": "https://api.altovar.net",
"createdAt": "2025-02-18T10:00:00Z"
}
}La acsUrl (URL del Assertion Consumer Service) y el entityId en la respuesta son los valores del Proveedor de Servicios que deben configurarse en el Proveedor de Identidad del cliente. Para SAML, establece la ACS URL como URL de respuesta y el entity ID de Auris como audiencia. Para OIDC, registra la acsUrl como URI de redirección en el IdP.
Códigos de error
| Código | HTTP | Descripción |
|---|---|---|
VALIDATION_ERROR | 400 | Faltan campos requeridos o la configuración es inválida |
METADATA_FETCH_FAILED | 400 | No se pudo obtener o analizar la URL de metadatos SAML |
DISCOVERY_FETCH_FAILED | 400 | No se pudo obtener o analizar el documento de descubrimiento OIDC |
SSO_CONNECTION_EXISTS | 409 | Ya existe una conexión SSO de este tipo para la organización |
/api/organizations/[orgId]/sso/connections/[id]Requires: view:sso_connectionsObtiene los detalles completos de una conexión SSO específica, incluyendo la configuración (con secretos ocultados), los valores de metadatos del SP y los dominios asociados.
Respuesta exitosa
{
"ok": true,
"data": {
"id": "sso_abc123",
"type": "saml",
"name": "Acme Corporate SAML",
"status": "ACTIVE",
"keycloakIdpAlias": "acme-saml-abc123",
"config": {
"entityId": "https://idp.acme-corp.com",
"ssoUrl": "https://idp.acme-corp.com/saml2/sso",
"certificate": "-----BEGIN CERTIFICATE-----\nMIIDpD..."
},
"acsUrl": "https://api.altovar.net/api/auth/sso/callback",
"spEntityId": "https://api.altovar.net",
"domains": ["acme-corp.com"],
"createdAt": "2025-01-20T09:00:00Z",
"updatedAt": "2025-02-01T14:30:00Z"
}
}/api/organizations/[orgId]/sso/connections/[id]Requires: manage:sso_connectionsActualiza el nombre o la configuración de una conexión SSO. El tipo de conexión (saml o oidc)
no puede cambiarse después de la creación. Actualizar la configuración dispara una resincronización
con el broker de IdP de Keycloak.
Cuerpo de la solicitud
{
"name": "Acme Corporate SAML (Updated)",
"config": {
"ssoUrl": "https://new-idp.acme-corp.com/saml2/sso",
"certificate": "-----BEGIN CERTIFICATE-----\nMIIEnD..."
}
}Respuesta exitosa
{
"ok": true,
"data": {
"id": "sso_abc123",
"type": "saml",
"name": "Acme Corporate SAML (Updated)",
"status": "ACTIVE",
"updatedAt": "2025-02-18T11:00:00Z"
}
}/api/organizations/[orgId]/sso/connections/[id]Requires: manage:sso_connectionsElimina una conexión SSO. El Proveedor de Identidad de Keycloak correspondiente es eliminado. Los usuarios que se autenticaron previamente a través de esta conexión tendrán que usar inicio de sesión con contraseña. Sus cuentas y datos se conservan.
Eliminar una conexión SSO activa afecta inmediatamente a todos los usuarios que se autentican a través de ella. Deberán restablecer su contraseña (mediante el flujo de contraseña olvidada) si nunca han establecido una, ya que los usuarios de SSO se aprovisionan con JIT sin contraseña.
Respuesta exitosa
{
"ok": true,
"data": { "deleted": true }
}Activar y Desactivar
/api/organizations/[orgId]/sso/connections/[id]/activateRequires: manage:sso_connectionsActiva una conexión SSO en estado PENDING o DISABLED. Tras la activación, los usuarios que inicien sesión con un correo de dominio verificado son redirigidos automáticamente al Proveedor de Identidad configurado. La activación requiere que al menos un dominio verificado esté asociado a la organización.
Solicitud: No se requiere cuerpo.
Respuesta exitosa
{
"ok": true,
"data": {
"activated": true,
"status": "ACTIVE"
}
}Códigos de error
| Código | HTTP | Descripción |
|---|---|---|
NO_VERIFIED_DOMAINS | 400 | No se puede activar el SSO sin al menos un dominio verificado |
CONNECTION_NOT_FOUND | 404 | La conexión SSO no existe |
/api/organizations/[orgId]/sso/connections/[id]/deactivateRequires: manage:sso_connectionsDesactiva una conexión SSO activa. Los usuarios con correos de dominio recurrirán a la autenticación estándar por contraseña. La configuración de la conexión se conserva y puede reactivarse posteriormente.
Solicitud: No se requiere cuerpo.
Respuesta exitosa
{
"ok": true,
"data": {
"deactivated": true,
"status": "DISABLED"
}
}Verificación de Dominio
La verificación de dominio demuestra que controlas un dominio de correo electrónico antes de habilitar la redirección automática basada en SSO para ese dominio. La verificación se realiza mediante un registro DNS (TXT o CNAME). Una vez verificado un dominio, cualquier usuario que inicie sesión con una dirección de correo en ese dominio es redirigido automáticamente al proveedor SSO de la organización.
/api/organizations/[orgId]/sso/domainsRequires: view:sso_connectionsLista todos los dominios asociados a la configuración SSO de una organización, incluyendo su estado de verificación, método y token.
Respuesta exitosa
{
"ok": true,
"data": [
{
"id": "dom_abc123",
"domain": "acme-corp.com",
"status": "ACTIVE",
"verificationMethod": "TXT",
"verificationToken": "auris-verify-abc123def456",
"verifiedAt": "2025-01-22T14:00:00Z",
"createdAt": "2025-01-20T10:00:00Z"
},
{
"id": "dom_def456",
"domain": "acme.io",
"status": "PENDING",
"verificationMethod": "CNAME",
"verificationToken": "auris-verify-ghi789jkl012",
"verifiedAt": null,
"createdAt": "2025-02-10T08:00:00Z"
}
]
}Estados de verificación de dominio:
| Estado | Descripción |
|---|---|
PENDING | Dominio añadido, registro DNS aún no verificado |
VERIFYING | La verificación está en progreso |
ACTIVE | Dominio verificado correctamente — la redirección automática SSO está activa para este dominio |
FAILED | La verificación se ejecutó pero no se encontró el registro DNS esperado |
/api/organizations/[orgId]/sso/domainsRequires: manage:sso_connectionsAñade un dominio a la organización e inicia la verificación. Auris genera un token de verificación único que debe añadirse como registro DNS en el dominio. La respuesta incluye el registro DNS exacto que se debe crear.
Cuerpo de la solicitud
{
"domain": "acme-corp.com"
}Respuesta exitosa
{
"ok": true,
"data": {
"id": "dom_ghi789",
"domain": "acme-corp.com",
"status": "PENDING",
"verificationMethod": "TXT",
"verificationToken": "auris-verify-mno345pqr678",
"dnsRecord": {
"type": "TXT",
"host": "_auris-verify.acme-corp.com",
"value": "auris-verify-mno345pqr678"
}
}
}Añade el registro DNS que se muestra en dnsRecord en tu registrador de dominios y luego llama al endpoint de verificación para confirmar.
Códigos de error
| Código | HTTP | Descripción |
|---|---|---|
DOMAIN_TAKEN | 409 | Este dominio ya está registrado en otra organización |
VALIDATION_ERROR | 400 | Formato de dominio inválido |
DOMAIN_EXISTS | 409 | Este dominio ya está asociado a esta organización |
Auris admite dos métodos de verificación DNS. Los registros TXT (por defecto) requieren añadir un registro TXT en _auris-verify.tudominio.com. Los registros CNAME requieren apuntar un CNAME a verify.accounts.altovar.net. El método se elige automáticamente según la configuración del dominio, pero se prefiere TXT ya que no interfiere con los registros DNS existentes.
/api/organizations/[orgId]/sso/domains/[id]/checkRequires: manage:sso_connectionsDesencadena una consulta DNS en vivo para verificar el dominio. Auris realiza una consulta DNS TXT
(o CNAME) usando dns.promises.resolveTxt() y comprueba el token de verificación. Devuelve
el estado actualizado del dominio inmediatamente.
Solicitud: No se requiere cuerpo.
Respuesta exitosa — verificado
{
"ok": true,
"data": {
"domain": "acme-corp.com",
"status": "ACTIVE",
"verifiedAt": "2025-02-18T15:00:00Z"
}
}Respuesta exitosa — aún no propagado
{
"ok": true,
"data": {
"domain": "acme-corp.com",
"status": "PENDING",
"message": "TXT record not found yet. DNS propagation can take up to 48 hours."
}
}Respuesta exitosa — fallido
{
"ok": true,
"data": {
"domain": "acme-corp.com",
"status": "FAILED",
"message": "DNS lookup completed but the verification token was not found in any TXT records."
}
}La propagación DNS generalmente tarda unos minutos, pero en casos raros puede tardar hasta 48 horas. Puedes llamar al endpoint de verificación repetidamente hasta que el estado pase a ACTIVE. Un estado FAILED no bloquea la verificación de forma permanente — corrige el registro DNS y vuelve a llamar al endpoint de verificación.
Endpoints SSO Públicos
Estos endpoints son utilizados por la página de inicio de sesión alojada de Auris y el SDK para ejecutar el flujo SSO. No requieren autenticación.
/api/auth/sso/detectDetecta si el dominio de correo electrónico de un usuario tiene una conexión SSO Empresarial activa. Úsalo para construir formularios de inicio de sesión “inteligentes” que redirijan automáticamente a los usuarios empresariales a su proveedor SSO en lugar de mostrar el campo de contraseña.
Cuerpo de la solicitud
{
"email": "[email protected]"
}Respuesta — SSO disponible
{
"ok": true,
"data": {
"ssoAvailable": true,
"provider": "saml",
"loginUrl": "https://api.altovar.net/api/auth/sso/login/acme-saml-abc123"
}
}Respuesta — sin SSO
{
"ok": true,
"data": {
"ssoAvailable": false,
"provider": null,
"loginUrl": null
}
}La respuesta siempre es 200 OK independientemente de si el dominio tiene SSO configurado, para evitar la fuga de información sobre qué organizaciones usan SSO.
/api/auth/sso/login/[alias]Inicia el flujo de inicio de sesión SSO. Redirige el navegador a la página de inicio de sesión del
Proveedor de Identidad configurado. El alias es el alias del IdP de Keycloak devuelto al crear
la conexión SSO (el campo keycloakIdpAlias).
Este endpoint es una redirección del navegador, no una llamada de API. El flujo típico:
- El cliente detecta SSO mediante
POST /api/auth/sso/detect - El cliente redirige el navegador a la
loginUrlde la respuesta de detección - Auris redirige a la página de inicio de sesión del IdP
- El usuario se autentica en el IdP
- El IdP redirige de vuelta al endpoint de callback de Auris
- Auris emite tokens y redirige a la URL de callback de la aplicación
Parámetros de consulta
| Parámetro | Tipo | Descripción |
|---|---|---|
redirect_uri | string | Opcional. A dónde redirigir al usuario tras una autenticación SSO exitosa. Debe ser una URI de redirección registrada para la aplicación. |
/api/auth/sso/callbackEndpoint de callback SSO. El Proveedor de Identidad redirige al usuario aquí después de una autenticación exitosa. Auris valida la aserción SSO (respuesta SAML o código de autorización OIDC), realiza el aprovisionamiento JIT de usuario si es necesario y emite tokens de Auris.
Este endpoint es llamado por el Proveedor de Identidad, no por tu aplicación directamente.
Aprovisionamiento JIT (Just-In-Time)
Cuando un usuario se autentica mediante SSO por primera vez y aún no tiene cuenta en Auris, Auris automáticamente:
- Crea una nueva cuenta de usuario usando los atributos de la aserción SSO (correo electrónico, nombre, apellido)
- Vincula al usuario a la organización propietaria de la conexión SSO
- Asigna el rol de miembro predeterminado (
MEMBER) - Emite los tokens de acceso y refresh estándar de Auris
En los inicios de sesión posteriores, el registro de usuario existente se localiza por correo electrónico y los tokens se emiten directamente.
Redirección en caso de éxito
Tras una autenticación exitosa, el usuario es redirigido a la URL de callback registrada de la aplicación con un código de autorización:
https://app.tudominio.com/callback?code=auth_code_xxx&state=original_stateEl código de autorización puede entonces canjearse por tokens usando el endpoint estándar POST /api/auth/token con grant_type=authorization_code.
Gestión de errores
Si la aserción SSO es inválida o el IdP devuelve un error, el usuario es redirigido al callback de la aplicación con parámetros de error:
https://app.tudominio.com/callback?error=sso_failed&error_description=SAML+assertion+validation+failed&state=original_state| Error | Descripción |
|---|---|
sso_failed | La aserción SSO no pudo validarse |
sso_connection_disabled | La conexión SSO ha sido desactivada |
sso_connection_not_found | El alias del IdP no coincide con ninguna conexión SSO configurada |
email_mismatch | El correo electrónico de la aserción SSO no corresponde a un dominio verificado |
Referencia de Permisos
| Permiso | Descripción |
|---|---|
view:sso_connections | Ver conexiones SSO y el estado de verificación de dominio |
manage:sso_connections | Crear, actualizar, eliminar, activar y desactivar conexiones SSO; gestionar la verificación de dominios |
El permiso manage:sso_connections implica view:sso_connections. Los usuarios con manage:sso_connections pueden realizar todas las operaciones relacionadas con SSO.
Notas de Implementación
Broker de IdP de Keycloak: Internamente, Auris crea y gestiona configuraciones de Proveedor de Identidad de Keycloak. Cada conexión SSO corresponde a un IdP de Keycloak con un alias único. El realm de Keycloak para la conexión está determinado por el campo keycloakRealm en el registro de la conexión. Esto es un detalle de implementación — tu aplicación solo interactúa con la API de Auris.
Rotación de Certificados: Para las conexiones SAML, actualiza el campo certificate en la configuración de la conexión cuando el IdP rote su certificado de firma. Auris no detecta automáticamente los cambios de certificado. Durante la rotación, puedes mantener temporalmente los certificados nuevo y antiguo actualizando la conexión antes de que el antiguo expire.
Caché del Descubrimiento OIDC: Al usar OIDC, Auris almacena en caché el documento de descubrimiento. Si el IdP cambia sus endpoints, actualiza la discoveryUrl o espera a que la caché expire (aproximadamente 1 hora).
Relacionado
- Guía de SSO Empresarial — Configura conexiones SAML 2.0 y OIDC
- Single Sign-On — Tutorial de integración SSO
- SSO Empresarial — Configura conexiones SSO desde la Consola
- API de Organizaciones — Endpoints de organizaciones a las que pertenecen las conexiones SSO