Définir les rôles d'un membre
PUT /fapi/v1/organizations/{org_id}/memberships/{membership_id}/roles · appelé depuis l'hôte de connexion de l'environnement
Remplace les rôles d'une adhésion par un ensemble complet, pour un écran de profil d'organisation. L'ensemble ne couvre que les rôles visibles par vous dans cette organisation : ses propres rôles et les rôles de l'environnement ouverts aux administrateurs de l'organisation. Les autres rôles du membre sont conservés. Un ensemble vide supprime tous les rôles visibles ; si le membre n'en a plus aucun, le rôle par défaut de l'organisation lui est attribué.
Exige le cookie __Host-idp_session de l'utilisateur authentifié avec un Origin exact, ou un jeton d'accès à l'API frontale d'une application de premier niveau (Authorization: DPoP <token> avec une preuve DPoP ; voir Jeton d'accès à l'API frontale). L'utilisateur doit être un membre actif de l'organisation disposant de l'autorisation idp_members:update_roles. Un utilisateur qui n'est pas membre reçoit 404 not_found ; un membre sans cette autorisation reçoit 403 insufficient_permissions.
Règles d'attribution :
- Chaque autorisation de chaque rôle que vous attribuez doit être une autorisation que vous détenez vous-même.
- Seul un membre détenant le rôle d'administrateur peut attribuer un rôle privilégié.
- Vous ne pouvez pas modifier vos propres rôles.
- Le dernier administrateur actif ne peut pas perdre le rôle d'administrateur (
409 last_org_admin).
Avec @keenauth/js : await keenauth.organizations.setMemberRoles(orgId, membershipId, [roleId], { expectedVersion: 3 }).
Requête
En-têtes :
| En-tête | Obligatoire | Description |
|---|---|---|
Idp-Client |
oui | Identifiant du SDK. |
Origin |
oui, avec le cookie | https://<hôte de connexion>. |
If-Match |
non | Une seule version, "<version>", issue de la liste des membres. Une version qui ne correspond pas, ou plusieurs versions, renvoient 412 precondition_failed. |
org_id : l'identifiant de l'organisation (org_…). membership_id : l'identifiant de l'adhésion (mem_…).
Corps : {"role_ids": ["rol_…"]}, 50 rôles au maximum. role_ids est obligatoire ; [] est un ensemble valide.
Réponse
200 OK avec l'adhésion (les mêmes champs qu'un élément de la liste des membres) et ETag: "<version>".
Erreurs
| Statut | Code | Quand |
|---|---|---|
| 400 | malformed_request |
If-Match est mal formé. |
| 400 | unknown_field |
Le corps contient un champ autre que role_ids. |
| 401 | unauthenticated |
Aucun cookie de session ou jeton valide. |
| 403 | insufficient_permissions |
L'utilisateur ne dispose pas de idp_members:update_roles dans l'organisation. |
| 403 | role_not_assignable |
Une règle d'attribution ci-dessus refuse la modification. |
| 403 | origin_not_allowed |
L'Origin ne correspond pas. |
| 404 | not_found |
Aucune organisation, adhésion ou rôle de ce type pour cet utilisateur ; un identifiant inconnu, mal formé ou étranger donne la même réponse. |
| 409 | last_org_admin |
La modification laisserait l'organisation sans administrateur actif. |
| 409 | role_limit_reached |
Le membre détiendrait plus de 50 rôles. |
| 409 | organization_disabled |
L'organisation est désactivée ou en attente de suppression (organization_pending_deletion). |
| 412 | precondition_failed |
If-Match ne correspond pas à la version actuelle de l'adhésion. |
| 422 | validation_failed |
role_ids est absent, trop long ou contient un identifiant mal formé. |
| 503 | service_unavailable |
Service temporairement indisponible ; réessayez après Retry-After. |
Exemple
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
}
Données personnelles
Ce point de terminaison traite des données personnelles : adhésions et invitations à une organisation. Données personnelles dans les API KeenAuth décrit ce qui est stocké, la durée de conservation et la suppression. Ne transmettez aucune donnée sensible (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans aucun champ.