Repository navigation
FR Equipe Invitations
English · Type : procédure · 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 CIstudioHosted; 3 fichiers de tests · passes humaines :studio-hostedpas faite (#149),studio-collabpas faite (#150),studio-previewpas faite (#166),studio-assets-hostedpas faite (#167),studio-mcp-remotepas faite (#196),studio-oidc-genericpas faite (#197) · limites connues :invitation-no-revoke
Personne n'est membre d'un Studio d'équipe par défaut : c'est une invitation qui en fait un. Cette page dit comment un owner invite quelqu'un, comment le premier owner entre, et ce qu'une invitation peut et ne peut pas faire.
Un lien à usage unique pour une adresse email et un rôle. Quand cette personne l'ouvre et se connecte avec cet email, vérifié par le fournisseur d'identité, elle devient membre avec ce rôle.
Un Studio hébergé (le Studio Server) avec un fournisseur OpenID Connect, depuis la 4.2.1. Le Studio local n'a ni membres ni invitations.
- Un owner, pour inviter depuis le Studio ou l'API ; ou un shell sur la machine du serveur, pour le premier owner.
- La personne a un compte chez le fournisseur, avec une adresse email vérifiée : l'invitation compare l'email que le fournisseur dit vérifié, jamais une adresse tapée à la main.
- Dans le Studio : votre nom dans l'en-tête, puis Members… (owners seulement).
- Par l'API : depuis n'importe quelle machine, avec le jeton d'un owner.
- Le premier owner : sur la machine de l'application
studio, là où est la configuration du serveur (sur Clever Cloud, dansclever ssh), dans le dossier du dépôt du moteur.
-
Le premier owner passe par la ligne de commande, puisque personne ne peut encore inviter :
# sur la machine de l'app studio, dans le dépôt du moteur (sur Clever Cloud : clever ssh, puis cd "$APP_HOME") npm run studio-server -- invite --email you@example.fr --role ownerElle affiche le lien. La configuration vient de
--config <fichier>ou deSTUDIO_CONFIG_JSON, que le shell declever ssha déjà. Depuis l'archive de la release, la commande estnpx quest-n-click-studio-server invite --email you@example.fr --role owner --config studio.config.json.
-
Tout autre membre, dans le Studio : Members…, puis le formulaire Invite. Tapez l'email (vérifié chez le fournisseur), choisissez le rôle (
owner,devoureviewer;devest présélectionné), et cliquez sur Create the invitation link. Le lien apparaît avec un bouton Copy.Par l'API, en owner :
# n'importe où, avec le jeton d'un owner curl -X POST -H "Authorization: Bearer $TOKEN" -H "content-type: application/json" \ -d '{"email": "lea@example.org", "role": "dev"}' https://studio.example.fr/api/invitations
La réponse est
{"link": "https://studio.example.fr/auth/login?invite=…", "expiresInDays": 7}.
- Envoyez le lien vous-même (le Studio n'envoie aucun email) : par messagerie, par mail. Il n'est montré qu'une fois ; seule son empreinte est gardée.
- La personne ouvre le lien et se connecte chez le fournisseur avec cet email. Au retour, elle est membre avec le rôle prévu. Voir Débuter comme dev invité.
- Dans Members…, la personne apparaît avec son rôle ; l'invitation quitte « Invitations not used yet ».
- Le journal d'audit montre
invited(qui a invité qui, avec quel rôle), puisjoined as <rôle>(invitation-accepted). - En son nom,
GET /auth/merépond son rôle.
- 7 jours, puis elle ne fonctionne plus.
- Un seul usage. Une seconde utilisation, par qui que ce soit, ne fait rien.
- Pour un seul email vérifié. L'email donné par le fournisseur doit être celui de l'invitation (comparé sans tenir compte de la casse), et le fournisseur doit le dire vérifié.
- Elle donne le rôle qu'elle nomme. Accepter une invitation remplace le rôle qu'avait la personne, sauf que le dernier owner ne peut pas perdre son rôle d'owner de cette façon.
- Une invitation refusée n'empêche pas la connexion : la personne est connectée mais pas membre, et voit la page
« Access not granted », « Ask an owner of the project for an invitation. ». Le journal d'audit note
invitation-refusedavec la raison (the invitation is not valid,the invitation is for another verified email, outhe last owner stays an owner).
Garantie ·
invitation-once-verified-email· référencée · portée vérifiée par son auteur (IA), pas relue Une invitation ne sert qu'une fois, et seulement à une personne dont l'email vérifié est celui qu'elle nomme.
Limite ·
invitation-no-revokeUne invitation en attente ne peut pas être retirée : aucune route, ni dans le Studio ni dans l'API, ne l'annule. Elle expire au bout de 7 jours. Si un lien a fuité, attendez son expiration, ou retirez la personne une fois entrée (voir Gérer les membres). Aucune commande ne liste non plus les invitations, en dehors deGET /api/members(sesinvitations: email, rôle, expiration) et du panneau Members.
| Symptôme | Cause | Correction |
|---|---|---|
| La personne se connecte et voit « Access not granted » | L'invitation a expiré, a déjà servi, ou son email vérifié est différent | Le journal d'audit dit lequel (invitation-refused, raison). Invitez de nouveau avec l'email qu'a le fournisseur |
`email` is required (400) |
L'adresse est vide ou mal formée | Donnez une adresse complète |
`role` is owner, dev or reviewer (400) |
Un autre nom de rôle | Utilisez l'un des trois |
usage: studio-server invite --email <email> --role <owner|dev|reviewer> --config <file> (code 2) |
Un drapeau manque, ou un drapeau est à la place d'une valeur | Donnez les deux drapeaux avec leur valeur |
this login has expired or was already used: start again (400) |
La page de connexion est restée ouverte plus de 10 minutes, ou a été rechargée | Rouvrez le lien d'invitation |
Une ligne en base (studio_invitations : l'email, le rôle, l'empreinte du jeton, son expiration), puis une ligne de
membre quand elle est acceptée ; deux lignes d'audit. Aucun fichier du jeu.
Un mauvais rôle se change dans Members… (voir Gérer les membres). Une personne qui n'aurait pas dû entrer se retire au même endroit.
- Rôles et actions, Gérer les membres.
-
studio-server/src/server/auth/store.ts(invite,accept). - ADR 0027.
Generated publication · publication générée — current documentation · documentation courante: quest'n'click 4.4.0 r1, documentation revision · révision de la documentation 8dc717c69acb62c4742b69c54a7e7dfb620f75d8.
Earlier versions and permalinks · versions précédentes et liens permanents: https://wanoo.github.io/quest-n-click/docs/
An edit made in this wiki is overwritten at the next publication · une modification faite dans ce wiki est écrasée à la publication suivante.
Edit the source · Modifier la source · Report an error · Signaler une erreur
Index (6)
Démarrer (6)
Jouer (9)
Installer (17)
- Prérequis
- Installer depuis l'archive de la release
- Installer depuis npm, une fois publié
- Installer depuis le dépôt pour travailler sur le moteur
- doctor : vérifier sa machine
- Outils pour les images
- Outils audio : ffmpeg, fluidsynth, Furnace, uv
- Mettre à jour
- Notes de mise à jour : 4.4
- Notes de mise à jour : 4.3
- Notes de mise à jour : 4.2
- Notes de mise à jour : 4.1
- Notes de mise à jour : v3
- Notes de mise à jour : v2 vers v3
- Venir de web-scumm
- Référence du paquet
- Dépannage de l'installation
Créer un jeu (55)
- Votre premier jeu
- Organisation d'un projet créé et du dépôt du moteur
- La boucle de travail
- Principes du contenu et contrat d'identité
- Salles
- Géométrie : placement, zones de marche, masques, calques, caméra
- Un objet est visible mais inaccessible
- Réactions
- Commandes du jeu
- Conditions
- Drapeaux, variables et événements : lequel choisir
- Code sur mesure
- Personnages
- Objets et inventaire
- Carte du monde
- Dialogues
- Scripts et événements
- Faire bouger les personnages : patrouilles et marches
- Sorties
- Chapitres et objectifs
- État et sauvegardes : persistant ou temporaire, renommer un id, migrations
- Mise en scène : salles larges et animations
- La scène : lumières, particules, sols
- Habillage et polices
- Titre et générique
- Héros : plusieurs personnages et choix du héros
- Mini-jeux intégrés
- Un mini-jeu sur mesure
- Traductions
- Musique en stems
- Bruitages
- Voix : par langue et par héros
- Images : prompts, découpe des planches, transparence, échelle
- Provenance des assets
- Le storyboard, source de vérité
- Concevoir des énigmes
- Mécaniques classiques
- Pages de relecture
- Référence du DSL
- Vérifier son jeu
- Ce que prouve le solveur
- Options du solveur
- Playtests
- Remix
- Speedrun pour les auteurs
- La fin scellée
- Modèle de production
- Jeux d'exemple
- Travailler avec une IA
- Construire et publier un jeu
- Publier sur GitHub Pages
- Le jeu statique sur Clever Cloud
- Autres hébergeurs statiques
- Sous-chemin, cache et service worker, déploiement incomplet, retour arrière
- Tester sur un téléphone en réseau local
Studio local (24)
- Le Studio local : présentation et lancement
- Modifier une salle
- Placement et scène
- Aperçu, application, annulation
- Storyboard
- Assets et découpe
- Vérifier : validateur, solveur, chemin critique, chaleur, santé, couverture
- Captures avant et après
- Diff sémantique
- Jouer et rejouer une session
- Explication des règles
- Langue et objectifs
- Voix et matrice héros × langues
- Carte
- Notes
- Remix dans le Studio
- Musique
- L'Assistant : votre propre clé
- Mode démo et studio-apply
- Sécurité en local et en réseau local
- API du Studio
- MCP local : configurer chaque client
- Outils MCP
- Dépannage du Studio
Studio d'équipe (21)
- Ce qui tourne où
- Concepts : révision, transaction, pan, bail, aperçu, build
- Débuter comme dev invité
- Travailler ensemble au quotidien
- Rôles et actions : la matrice complète
- Invitations
- Gérer les membres
- Écriture refusée sur le Studio hébergé : révision de base périmée (409)
- Écriture refusée sur le Studio hébergé : pan verrouillé (423)
- Reprendre après un bail perdu, une déconnexion ou un aperçu périmé
- Commentaires
- Carte et diff sémantique
- Publier des builds
- MCP distant
- Le jeu dans Git
- Mettre à jour le moteur d'un jeu hébergé
- Assets hébergés
- La ligne de commande du serveur
- Routes de santé et de métriques
- L'essayer en local avec compose.yml
- Limites connues
Clever Cloud (23)
- Clever Cloud : vue d'ensemble, coût et prérequis
- Applications et add-ons
- Domaines et TLS
- Keycloak
- OIDC générique et GitLab
- Configuration
- Premier déploiement
- Sauvegardes
- RPO et RTO
- Exercice de restauration sur une installation vierge
- Redéploiements
- Mettre à jour le serveur et vérifier l'état après une migration
- Limites du retour arrière
- Supervision
- Sécurité
- Renouveler les clés
- Récupérer l'accès administrateur
- Changer de domaine ou de fournisseur OIDC
- Worker, PostgreSQL ou Cellar en panne
- Exporter le jeu et quitter l'installation
- Rétention
- Dépannage sur Clever Cloud
- Coûts et démontage
Reality Bridge et connecteurs (16)
- Le Reality Bridge : ce que c'est
- Démarrage rapide
- Garanties
- Installer et lancer le Bridge
- Sauvegarde et restauration
- Plusieurs tenants
- Signaux et manifeste
- La ligne de commande du Bridge
- Vue d'ensemble des connecteurs
- Connecteur email
- Connecteur Telnet
- Connecteur SSH
- Connecteur Open Badges
- Le SDK des connecteurs
- Sécurité : Biscuit et signatures
- Dépannage du Bridge et des connecteurs
Contribuer (25)
- Bienvenue
- Préparer son poste de développement
- La boucle de développement
- Avant une pull request
- Conventions
- Écrire la documentation
- Architecture
- Visite du code
- Frontières d'import
- Quels tests tournent quand
- Tests de mutation
- Le cliquet de couverture
- La référence de qualité
- La CI expliquée
- Passes de terrain
- Mesures de performance
- Publier une release
- Paquets npm
- Décisions et ADR
- Gouvernance
- Pull requests des bots
- Contribuer avec des agents IA
- Politique de sécurité
- Code de conduite
- Licences et crédits