URL base
XID expone API SCIM 2.0 con alcance de organización en /scim/v2/organizations/{organization_id}. Los recursos de usuarios y grupos se direccionan con el ID de organización en la ruta.
Configura tu proveedor de identidad con la URL base https://xid.dev/scim/v2/organizations/{organization_id} y el token de directorio que se muestra una sola vez cuando creas o rotas el directorio.
curl https://xid.dev/scim/v2/organizations/{organization_id}/Users \
-H 'Authorization: Bearer scim_xxx' \
-H 'Content-Type: application/scim+json'Autenticación
Las llamadas SCIM usan un token bearer de directorio creado desde la API de administración. XID almacena solo un hash del token y devuelve el token en texto claro una sola vez cuando se crea o se rota.
| Encabezado | Valor | Notas |
|---|---|---|
Authorization |
Bearer scim_xxx |
Requerido para puntos de conexión de usuarios y grupos con alcance de organización. |
Content-Type |
application/scim+json |
Requerido para solicitudes POST, PUT y PATCH. |
Accept |
application/scim+json |
Recomendado para todos los clientes SCIM. |
Puntos de conexión
| Punto de conexión | Métodos | Uso previsto |
|---|---|---|
/scim/v2/ServiceProviderConfig |
GET |
Respuesta ServiceProviderConfig para el descubrimiento de clientes SCIM. |
/scim/v2/Schemas |
GET |
Metadatos del esquema de usuario y grupo. |
/scim/v2/ResourceTypes |
GET |
Tipos de recursos SCIM compatibles. |
/scim/v2/organizations/{organization_id}/Users |
GET, POST |
Crear y listar usuarios de directorio. |
/scim/v2/organizations/{organization_id}/Users/{id} |
GET, PUT, PATCH, DELETE |
Leer, reemplazar, aplicar parche o desaprovisionar un usuario de directorio. |
/scim/v2/organizations/{organization_id}/Groups |
GET, POST |
Crear y listar grupos de directorio. |
/scim/v2/organizations/{organization_id}/Groups/{id} |
GET, PUT, PATCH, DELETE |
Leer, reemplazar, aplicar parche o eliminar un grupo de directorio. |
Recurso de usuario
Los recursos de usuario usan userName como identificador externo. Los valores de correo, campos de nombre del perfil, estado activo y campos de extensión empresarial se conservan en el perfil SCIM bruto.
| Campo SCIM | Comportamiento de XID |
|---|---|
id |
ID estable de usuario de directorio XID. |
userName |
Requerido. Debe ser único dentro del directorio. |
active |
false desaprovisiona al usuario y revoca las sesiones activas. |
emails |
El correo principal se usa para coincidencias y vinculación de cuentas. |
urn:ietf:params:scim:schemas:extension:enterprise:2.0:User |
Almacenado y devuelto para atributos empresariales como departamento. |
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "alice@example.com",
"active": true,
"name": { "givenName": "Alice", "familyName": "Lee" },
"emails": [{ "value": "alice@example.com", "primary": true }]
}Recurso de grupo
Los recursos de grupo usan displayName como nombre único de grupo de directorio. Los miembros referencian IDs de usuario SCIM y se sincronizan de forma idempotente.
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
"displayName": "Engineering",
"members": [
{ "value": "dir_user_123", "display": "alice@example.com" }
]
}Filtrado, ordenación y paginación
XID admite gramática de filtro SCIM con and, or, not y operadores de comparación (eq, ne, co, sw, ew, gt, ge, lt, le, pr). Las expresiones no soportadas devuelven invalidFilter. Las listas usan paginación SCIM base 1 con startIndex, count, totalResults, más sortBy y sortOrder opcionales.
| Consulta | Soporte |
|---|---|
filter=userName eq "alice@example.com" |
Buscar un usuario por userName. |
filter=displayName eq "Engineering" |
Buscar un grupo por displayName. |
filter=userName sw "alice" and active eq true |
Combinar operadores lógicos y de comparación. |
sortBy=userName&sortOrder=ascending |
Ordenar resultados de listas de usuarios o grupos. |
startIndex=1&count=100 |
Devolver hasta 100 recursos desde el primer resultado. |
attributes=userName,emails.value |
Devuelve solo schemas, id y los atributos SCIM solicitados. |
excludedAttributes=emails,meta |
Devuelve el recurso predeterminado sin los atributos SCIM excluidos. |
Operaciones masivas
POST /scim/v2/organizations/{organization_id}/Bulk acepta una BulkRequest con hasta 100 operaciones y límite de 1 MiB. Las respuestas devuelven el estado HTTP por operación en una BulkResponse aunque algunas fallen.
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:BulkRequest"],
"Operations": [
{
"method": "POST",
"path": "/Users",
"bulkId": "user1",
"data": { "userName": "alice@example.com", "active": true }
}
]
}ETag and If-Match
Las respuestas GET de recursos incluyen ETag: W/"<meta.version>" de meta.version. PUT y PATCH requieren encabezado If-Match con la versión actual; ausente → 428, desajuste → 412.
Operaciones PATCH
Las solicitudes PATCH usan urn:ietf:params:scim:api:messages:2.0:PatchOp. XID admite add, replace y remove para campos de perfil editables y membresías de grupo.
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{ "op": "replace", "path": "active", "value": false }
]
}Respuestas de error
Los errores SCIM devuelven application/scim+json con el esquema SCIM Error, estado HTTP, detalle y scimType opcional.
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
"status": "409",
"scimType": "uniqueness",
"detail": "userName already exists"
}Capacidades de ServiceProviderConfig
ServiceProviderConfiganunciasort.supported=true,bulk.supported=trueyetag.supported=true.- XID expone endpoints inbound de SCIM Service Provider para IdP externos. Los clientes de push SCIM para SaaS downstream tienen evidencia local con un SaaS simulado, pero la compatibilidad con producción aún requiere una L4 real de administración de SaaS.
Comportamiento de desaprovisionamiento
- La rotación del token de directorio mantiene válido el token anterior durante una breve ventana de gracia.
active=falseyDELETE /Users/{id}desaprovisionar al usuario y revocar sesiones activas.- Las actualizaciones de membresía de grupo son idempotentes. Los miembros desconocidos se pueden resolver después de que el usuario llegue desde el proveedor de identidad.