Skip to Content

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:

  1. 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).
  2. El administrador añade y verifica uno o más dominios de correo electrónico (p. ej., acme-corp.com) mediante registros DNS TXT.
  3. 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.
  4. 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

GET/api/organizations/[orgId]/sso/connectionsRequires: view:sso_connections

Lista 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ámetroTipoDescripción
pageintegerNúmero de página (predeterminado: 1)
limitintegerElementos 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:

EstadoDescripción
PENDINGConexión creada pero aún no activada
ACTIVEConexión activa — los usuarios con correos de dominio verificado son redirigidos
DISABLEDConexión desactivada por un administrador
ERRORLa conexión encontró un error de configuración durante la comunicación con el IdP
POST/api/organizations/[orgId]/sso/connectionsRequires: manage:sso_connections

Crea 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-----" } }
CampoRequeridoDescripción
metadataUrlNoURL a los metadatos SAML XML del IdP. Si se proporciona, entityId, ssoUrl y certificate se extraen automáticamente.
entityIdSí*El Entity ID (Issuer) del IdP. Requerido si no se proporciona metadataUrl.
ssoUrlSí*La URL del Servicio de Inicio de Sesión Único del IdP (binding HTTP-Redirect). Requerida si no se proporciona metadataUrl.
certificateSí*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" } }
CampoRequeridoDescripción
discoveryUrlSíLa URL de Descubrimiento OIDC del IdP. Auris obtiene el authorization_endpoint, el token_endpoint y el jwks_uri desde ella.
clientIdSíEl Client ID registrado en el IdP para Auris como parte confiante (relying party).
clientSecretSí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ódigoHTTPDescripción
VALIDATION_ERROR400Faltan campos requeridos o la configuración es inválida
METADATA_FETCH_FAILED400No se pudo obtener o analizar la URL de metadatos SAML
DISCOVERY_FETCH_FAILED400No se pudo obtener o analizar el documento de descubrimiento OIDC
SSO_CONNECTION_EXISTS409Ya existe una conexión SSO de este tipo para la organización
GET/api/organizations/[orgId]/sso/connections/[id]Requires: view:sso_connections

Obtiene 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" } }
PATCH/api/organizations/[orgId]/sso/connections/[id]Requires: manage:sso_connections

Actualiza 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" } }
DELETE/api/organizations/[orgId]/sso/connections/[id]Requires: manage:sso_connections

Elimina 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

POST/api/organizations/[orgId]/sso/connections/[id]/activateRequires: manage:sso_connections

Activa 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ódigoHTTPDescripción
NO_VERIFIED_DOMAINS400No se puede activar el SSO sin al menos un dominio verificado
CONNECTION_NOT_FOUND404La conexión SSO no existe
POST/api/organizations/[orgId]/sso/connections/[id]/deactivateRequires: manage:sso_connections

Desactiva 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.

GET/api/organizations/[orgId]/sso/domainsRequires: view:sso_connections

Lista 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:

EstadoDescripción
PENDINGDominio añadido, registro DNS aún no verificado
VERIFYINGLa verificación está en progreso
ACTIVEDominio verificado correctamente — la redirección automática SSO está activa para este dominio
FAILEDLa verificación se ejecutó pero no se encontró el registro DNS esperado
POST/api/organizations/[orgId]/sso/domainsRequires: manage:sso_connections

Añ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ódigoHTTPDescripción
DOMAIN_TAKEN409Este dominio ya está registrado en otra organización
VALIDATION_ERROR400Formato de dominio inválido
DOMAIN_EXISTS409Este 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.

POST/api/organizations/[orgId]/sso/domains/[id]/checkRequires: manage:sso_connections

Desencadena 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.

POST/api/auth/sso/detect

Detecta 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.

GET/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:

  1. El cliente detecta SSO mediante POST /api/auth/sso/detect
  2. El cliente redirige el navegador a la loginUrl de la respuesta de detección
  3. Auris redirige a la página de inicio de sesión del IdP
  4. El usuario se autentica en el IdP
  5. El IdP redirige de vuelta al endpoint de callback de Auris
  6. Auris emite tokens y redirige a la URL de callback de la aplicación

Parámetros de consulta

ParámetroTipoDescripción
redirect_uristringOpcional. A dónde redirigir al usuario tras una autenticación SSO exitosa. Debe ser una URI de redirección registrada para la aplicación.
GET/api/auth/sso/callback

Endpoint 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:

  1. Crea una nueva cuenta de usuario usando los atributos de la aserción SSO (correo electrónico, nombre, apellido)
  2. Vincula al usuario a la organización propietaria de la conexión SSO
  3. Asigna el rol de miembro predeterminado (MEMBER)
  4. 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_state

El 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
ErrorDescripción
sso_failedLa aserción SSO no pudo validarse
sso_connection_disabledLa conexión SSO ha sido desactivada
sso_connection_not_foundEl alias del IdP no coincide con ninguna conexión SSO configurada
email_mismatchEl correo electrónico de la aserción SSO no corresponde a un dominio verificado

Referencia de Permisos

PermisoDescripción
view:sso_connectionsVer conexiones SSO y el estado de verificación de dominio
manage:sso_connectionsCrear, 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