
# 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](/docs/api/fapi/front-api-token)). 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](/docs/api/fapi/organizations/memberships/list)) 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

```bash
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"]}'
```

```json
{
  "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](/docs/policies/personal-data) 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.
