Establecer los roles de un miembro
PUT /fapi/v1/organizations/{org_id}/memberships/{membership_id}/roles · llamado desde el host de inicio de sesión del entorno
Reemplaza los roles de una membresía por un conjunto completo, para una pantalla de perfil de organización. El conjunto abarca solo los roles que usted puede ver en esta organización: sus propios roles y los roles del entorno abiertos a los administradores de la organización. Los demás roles del miembro se mantienen. Un conjunto vacío elimina todos los roles que usted puede ver; si el miembro se queda sin ninguno, se le asigna el rol predeterminado de la organización.
Requiere la cookie __Host-idp_session del usuario autenticado con un Origin exacto, o un token de acceso de la API frontal de una aplicación propia (Authorization: DPoP <token> con una prueba DPoP; consulte Token de acceso a la API frontal). El usuario debe ser un miembro activo de la organización con el permiso idp_members:update_roles. Un usuario que no es miembro recibe 404 not_found; un miembro sin el permiso recibe 403 insufficient_permissions.
Reglas de asignación:
- Cada permiso de cada rol que asigne debe ser uno que usted mismo posea.
- Solo un miembro que tenga el rol de administrador puede asignar un rol privilegiado.
- No puede cambiar sus propios roles.
- El último administrador activo no puede perder el rol de administrador (
409 last_org_admin).
Con @keenauth/js: await keenauth.organizations.setMemberRoles(orgId, membershipId, [roleId], { expectedVersion: 3 }).
Solicitud
Encabezados:
| Encabezado | Obligatorio | Descripción |
|---|---|---|
Idp-Client |
sí | Identificador del SDK. |
Origin |
sí, con la cookie | https://<host de inicio de sesión>. |
If-Match |
no | Una versión, "<versión>", de la lista de miembros. Una versión que no coincide, o más de una versión, devuelve 412 precondition_failed. |
org_id: el identificador de la organización (org_…). membership_id: el identificador de la membresía (mem_…).
Cuerpo: {"role_ids": ["rol_…"]}, con un máximo de 50 roles. role_ids es obligatorio; [] es un conjunto válido.
Respuesta
200 OK con la membresía (los mismos campos que un elemento de la lista de miembros) y ETag: "<versión>".
Errores
| Estado | Código | Cuándo |
|---|---|---|
| 400 | malformed_request |
If-Match está mal formado. |
| 400 | unknown_field |
El cuerpo tiene un campo distinto de role_ids. |
| 401 | unauthenticated |
No hay cookie de sesión ni token válidos. |
| 403 | insufficient_permissions |
El usuario no tiene idp_members:update_roles en la organización. |
| 403 | role_not_assignable |
Una regla de asignación anterior rechaza el cambio. |
| 403 | origin_not_allowed |
El Origin no coincide. |
| 404 | not_found |
No existe la organización, la membresía o el rol para este usuario; un identificador desconocido, mal formado o ajeno recibe la misma respuesta. |
| 409 | last_org_admin |
El cambio dejaría la organización sin un administrador activo. |
| 409 | role_limit_reached |
El miembro tendría más de 50 roles. |
| 409 | organization_disabled |
La organización está deshabilitada o pendiente de eliminación (organization_pending_deletion). |
| 412 | precondition_failed |
If-Match no indica la versión actual de la membresía. |
| 422 | validation_failed |
Falta role_ids, es demasiado largo o contiene un identificador mal formado. |
| 503 | service_unavailable |
No disponible temporalmente; reintente después de Retry-After. |
Ejemplo
curl -X PUT "https://example.keenauth.app/fapi/v1/organizations/org_01jbz6x8kq3m2n4p5r6s7t8v9a/memberships/mem_01jbz6x8kq3m2n4p5r6s7t8v9b/roles" \
-H "Idp-Client: my-app/1.0.0 (node/22.0.0)" \
-H "Origin: https://example.keenauth.app" \
-H "Content-Type: application/json" \
-H 'If-Match: "3"' \
-b cookies.txt \
-d '{"role_ids":["rol_01jbz6x8kq3m2n4p5r6s7t8v9w"]}'
{
"id": "mem_01jbz6x8kq3m2n4p5r6s7t8v9b",
"user_id": "usr_01jbz6x8kq3m2n4p5r6s7t8v9c",
"status": "active",
"roles": [{ "role_id": "rol_01jbz6x8kq3m2n4p5r6s7t8v9w", "source": "admin_api" }],
"created_at": "2026-11-03T09:00:00Z",
"activated_at": "2026-11-03T09:00:00Z",
"expires_at": null,
"updated_at": "2026-11-03T10:00:00Z",
"version": 4
}
Datos personales
Este endpoint contiene datos personales: membresías de organizaciones e invitaciones. Datos personales en las API de KeenAuth describe qué se almacena, durante cuánto tiempo se conserva y cómo se elimina. No envíe categorías especiales de datos personales (salud, datos biométricos, religión, opiniones políticas, orientación sexual) en ningún campo.