quest'n'click 4.5.0 · r1

Construite pour quest'n'click 4.5.0, révision r1. Si elle est publiée, et laquelle est la courante, est dit par publication.json.

Gérer les membres

English · Type : procédure + référence · Public : administrateur · Contexte : Studio hébergé · Statut : prête · S'applique depuis : 4.2.1

Le Studio Server (Studio d'équipe hébergé) · contrat : expérimental · vérifié par la CI (matrice de support de la 4.4.0, 2026-10-23) : Postgres, S3 et Keycloak en CI ; Chromium et Firefox (job studio-hosted) ; WebKit sous macOS, à la main seulement · vérifications automatiques : jobs studio-hosted, studio-install-smoke ; plan de CI studioHosted ; 3 fichiers de tests · passes humaines : studio-hosted pas faite (#149), studio-collab pas faite (#150), studio-preview pas faite (#166), studio-assets-hosted pas faite (#167), studio-mcp-remote pas faite (#196), studio-oidc-generic pas faite (#197) · limites connues : audit-no-paging

Un owner d'un Studio d'équipe liste les membres, change un rôle, retire quelqu'un, met fin aux sessions de quelqu'un, et lit le journal d'audit. Cette page donne chaque action dans le Studio et par l'API, les routes telles que le code les définit, et ce qui n'est pas possible.

Ce que vous obtenez

L'équipe que vous voulez, avec les droits que vous voulez : qui est membre, avec quel rôle, et une trace de qui a fait quoi.

Contexte et versions

Un Studio hébergé (le Studio Server) avec un fournisseur OpenID Connect, depuis la 4.2.1. Toutes les actions de cette page reviennent à un owner. Les routes sont dans studio-server/src/server/auth/routes.ts et auth/store.ts ; le panneau est src/studio/members.ts.

Prérequis

Où lancer les commandes

Étapes

  1. Lister les membres. Ouvrez Members…, ou appelez GET /api/members (voir plus bas).
  1. Changer un rôle. Dans la ligne du membre, choisissez le nouveau rôle dans la liste et confirmez (« Make Léa reviewer? »). Ou PUT /api/members/<id> avec {"role": "reviewer"} (voir plus bas).
  1. Déconnecter quelqu'un partout. Cliquez sur End sessions et confirmez. La personne reste membre et peut se reconnecter. Ou DELETE /api/members/<id>/sessions (voir plus bas).
  1. Retirer un membre. Cliquez sur Remove et confirmez (« Their access ends at their next request. »). Ou DELETE /api/members/<id> (voir plus bas). Pour revenir, il lui faut une nouvelle invitation.
  1. Lire le journal d'audit, en bas du panneau, ou GET /api/audit (voir plus bas).

GET /api/members

Forme

# n'importe où, avec le jeton d'un owner
curl -H "Authorization: Bearer $TOKEN" https://studio.example.fr/api/members

Valeurs

{
  "members": [{ "id": "…", "email": "lea@example.org", "name": "Léa", "role": "dev", "sessions": 1 }],
  "invitations": [{ "email": "sam@example.org", "role": "reviewer", "expiresAt": 1761300000000 }]
}

PUT /api/members/<id>

Forme

PUT /api/members/<id> avec le corps JSON {"role": "owner" | "dev" | "reviewer"}. Répond {"ok": true}.

Effets

Contraintes

DELETE /api/members/<id>/sessions

Met fin à toutes les sessions de navigateur du membre et refuse tous les jetons d'accès émis avant maintenant. Ses flux en direct se ferment en 5 s et ses baux sont rendus. La personne reste membre : elle peut se reconnecter aussitôt, et la CLI peut obtenir un nouveau jeton grâce à son jeton de rafraîchissement. À utiliser après un portable perdu, avec un changement de mot de passe chez le fournisseur. Le journal d'audit note sessions-revoked.

DELETE /api/members/<id>

Effets

Contraintes

Garantie · owner-last-owner-and-removal · référencée · exécutée sur aff6caab7514 · portée vérifiée par son auteur (IA), pas relue Le dernier owner ne peut pas être rétrogradé (409), et un membre retiré perd l'accès à sa requête suivante, session comme jetons d'accès plus anciens.

Le dernier owner ne peut pas non plus être retiré : la même vérification répond 409.

Les comptes désactivés chez le fournisseur

Le Studio vérifie chaque session de navigateur auprès du fournisseur toutes les 5 minutes. Quand le fournisseur désactive un compte, ses sessions prennent fin à la vérification suivante, en 15 minutes au plus (R). Une déconnexion back-channel du fournisseur met fin aux sessions qu'elle nomme aussitôt. Si le fournisseur reste injoignable plus de 15 minutes, les sessions sont suspendues (503) jusqu'à ce qu'il réponde de nouveau. Retirer quelqu'un dans le Studio est immédiat ; le désactiver chez le fournisseur l'arrête sur tous les services à la fois. Voir ADR 0027.

GET /api/audit

Forme

# n'importe où, avec le jeton d'un owner
curl -H "Authorization: Bearer $TOKEN" https://studio.example.fr/api/audit

Valeurs

{"entries": [{"at", "actor", "event", "detail"}]}, les 200 entrées les plus récentes, de la plus récente à la plus ancienne. at est en millisecondes depuis 1970 ; actor est l'identifiant d'utilisateur Studio de qui a agi, null quand personne n'a agi (le fournisseur, un retour de connexion refusé), ou studio-server invite pour une invitation faite en ligne de commande.

eventQuanddetail
loginquelqu'un s'est connecté par le navigateur, membre ou non{}
logoutquelqu'un s'est déconnecté{}
login-failedla réponse du fournisseur a été refusée au retour de connexion{reason}
backchannel-logoutle fournisseur a mis fin à des sessions{sid, sub, users}
invitedune invitation a été créée{email, role}
invitation-acceptedquelqu'un est entré{role}
invitation-refusedune invitation n'a pas pu servir{reason}
member-roleun rôle a changé{userId, role}
member-removedun membre a été retiré{userId, role: null}
sessions-revokedun owner a mis fin aux sessions de quelqu'un{userId}
lease-takeoverun owner a repris un pan{span, previous}

Le panneau Members montre les 30 dernières, en phrases (« Léa removed Tom »).

Limite · audit-no-paging L'API ne donne que les 200 dernières entrées, sans filtre, sans pagination et sans export. Le serveur ne supprime jamais de ligne d'audit : elles restent dans la table studio_audit et dans chaque sauvegarde. Pour en lire plus, interrogez la base en lecture seule, par exemple SELECT at, actor, event, detail FROM studio_audit ORDER BY at DESC avec psql sur l'URI de la base. Les écritures du jeu ne sont pas dans l'audit : elles sont dans le journal, par auteur (GET /api/ops).

Ce qui n'est pas possible

Résultat attendu, et comment le vérifier

Le panneau Members montre le changement, et sa ligne apparaît dans le journal d'audit. Une personne retirée qui réessaie reçoit une 401 (sa session n'existe plus), puis « Access not granted » après s'être reconnectée.

Erreurs courantes

SymptômeCauseCorrection
409 the last owner stays an ownerVous rétrogradez ou retirez le seul ownerFaites d'abord quelqu'un d'autre owner
404 no such memberL'identifiant n'est pas un membre (déjà retiré ?)GET /api/members pour les identifiants
403 this needs the role ownerVotre rôle n'est pas ownerDemandez à un owner
401 sur /api/members avec un jetonLe jeton a expiré ou a été révoquéPrenez-en un nouveau : npm run studio-server -- token --server <url>

Fichiers ou données modifiés

Des lignes de studio_members, studio_sessions et studio_users (revoked_before) dans la base, et une ligne d'audit par action. Aucun fichier du jeu.

Revenir en arrière

Un rôle changé par erreur se rechange. Un retrait ne s'annule pas : invitez de nouveau la personne. Perdre tous les owners n'est pas possible par ces routes ; si le compte de l'owner est perdu chez le fournisseur, voir Retrouver l'accès administrateur.

Références


Modifier la source de cette page · Signaler une erreur