SCIM 2.0
Tu fuente de identidad escribe el directorio, con condiciones.
SCIM 2.0 en /scim/v2 para usuarios y grupos. Tokens ligados a un tenant, escrituras condicionales con If-Match y desactivación en lugar de borrado.
Verificado multi-nodoPATCH admite add y replace; filtros solo userName/externalId con eq; sin operaciones bulk.Código completo
Rutas.
| Método | Ruta | Uso |
|---|---|---|
| GET | /scim/v2/ServiceProviderConfig | Capacidades del servicio |
| GET | /scim/v2/Schemas | Esquemas User y Group |
| GET | /scim/v2/ResourceTypes | Tipos de recurso |
| GET, POST | /scim/v2/Users | Listar (filtro y paginación) y crear |
| GET, PUT, PATCH, DELETE | /scim/v2/Users/{id} | Leer, reemplazar, modificar, desactivar |
| GET, POST | /scim/v2/Groups | Listar y crear |
| GET, PUT, PATCH, DELETE | /scim/v2/Groups/{id} | Leer, reemplazar, modificar miembros, desactivar |
ServiceProviderConfig.
patch- admitido (add y replace)
filter- admitido, hasta 200 resultados (userName o externalId con eq)
etag- admitido
bulk- no admitido
sort- no admitido
changePassword- no admitido
autenticación- OAuth Bearer Token con alcance scim
Ejemplos.
El token debe ser un access token emitido por AUTH4US con el alcance scim. Un token de otro tenant se rechaza.
- Sin operaciones bulk.
- PATCH admite add y replace; remove no.
- Probado en CI de integración; no afirmamos compatibilidad certificada con un cliente SCIM externo concreto.
POST /scim/v2/Users
Authorization: Bearer <token con alcance scim>
Content-Type: application/scim+json
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "luis.mora",
"externalId": "hr-10442",
"name": { "givenName": "Luis", "familyName": "Mora" },
"active": true
}Respuesta 201 con ETag W/"1". Datos sintéticos.
PATCH /scim/v2/Users/<id>
If-Match: W/"1"
Content-Type: application/scim+json
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [{ "op": "replace", "path": "active", "value": false }]
}Si la versión cambió entre medio, la respuesta es 412.
GET /scim/v2/Users?filter=userName eq "luis.mora"&startIndex=1&count=50
Authorization: Bearer <token con alcance scim>Filtros admitidos: userName o externalId con eq. count llega hasta 200.
Veámoslo con tus aplicaciones.
Una demostración con datos sintéticos: tus flujos, tus métodos de entrada y tu modelo de tenants.