Repository navigation
FR Bridge Connecteur Open Badges
English · Procédure + référence · Publiée, relue par une personne · S'applique depuis : 4.3.0
Le connecteur Open Badges sert un petit formulaire : un joueur y poste un badge (une assertion Open Badges 2.0 ou un
justificatif 3.0) avec le code d’appairage que montre son jeu, le connecteur vérifie le badge, et le verdict
(valid, invalid, expired, revoked, indeterminate) propose le signal que le jeu lui associe. Le jeu ne reçoit
jamais le badge. Il est expérimental, comme tous les connecteurs (Vue d’ensemble des connecteurs).
Public, contexte, et statuts de ce sur quoi repose la page
Public : administrateur · Contexte : Reality Bridge
Les connecteurs (email, Telnet, SSH, Open Badges) · contrat : expérimental · vérifié par la CI (matrice de support de la 4.4.0, 2026-10-23) : Node 22 sous Ubuntu (Telnet et SSH pas sous Windows) · vérifications automatiques : jobs
connectors,connector-archive-e2e; plan de CIreality; 3 fichiers de tests · passes humaines :connectors-real-securitypas faite (#79) · limites connues :bridge-badge-code-once
Un processus quest-n-click-connector open-badge qui répond à POST /v1/badges, va chercher les documents du badge
sous une politique réseau stricte, et propose un signal par badge et par verdict.
- Un connecteur à côté d’un Bridge en marche, depuis la 4.1.9. Cette page s’applique à partir de la 4.3.0, version où
un badge signé avec une clé faible ou étrangère est devenu
invalid(une preuveeddsa-jcs-2022vérifiée avec une clé Ed25519 seulement ; RS256 demande un module d’au moins 2 048 bits, ES256 une clé P-256). -
Vérifié sur : non rejoué pour cette page. La CI le joue depuis l’archive de la release
(
npm run connector-archive-e2e) et contre douze badges d’essai (tests/connectors-badges.test.ts) ; personne ne lui a encore montré un vrai badge.
-
Un Bridge en marche (Installer et lancer le Bridge) et un jeu qui déclare les émetteurs auxquels il fait confiance et le signal de chaque verdict (Signaux et manifeste) :
'open-badge': { issuers: ['https://badges.example.org/issuer'], valid: 'badge.valid', revoked: 'badge.refused' }
-
Une page à vous qui poste le formulaire vers le connecteur (le connecteur sert la route, pas une page).
grant là où est le dossier du Bridge ; le connecteur derrière votre proxy HTTPS, dans un dossier qui contient sa
configuration et son jeton. npm run connector -- open-badge … dans le dépôt du moteur,
npx quest-n-click-connector open-badge … avec le paquet.
-
Donnez au connecteur son jeton, pour les signaux de badge seulement, avec l’appairage :
# dans le dépôt du moteur (le dossier du Bridge est .cache/bridge) npm run bridge -- grant --connector=garden-badges --source=badge --signals=badge.valid,badge.refused --pair > badge.token
-
Écrivez sa configuration,
badge.json;hostsvaut par défaut les hôtes des émetteurshttps:du jeu :{ "bridge": { "url": "http://127.0.0.1:8787/", "tokenFile": "badge.token" }, "gameId": "signals", "health": { "port": 9304 }, "open-badge": { "port": 8790, "hosts": ["badges.example.org"] } }
-
Lancez-le :
# dans le dépôt du moteur npm run connector -- open-badge --config badge.jsonIl refuse de démarrer quand le jeu ne déclare pas de
reality.connectors['open-badge'].
-
Un joueur poste, avec un code que le jeu vient de montrer :
# côté joueur (votre formulaire le fait) curl -s -X POST http://127.0.0.1:8790/v1/badges -H 'Content-Type: application/json' \ -d '{"code":"ABCD2345","badge":"https://badges.example.org/assertions/42","email":"player@example.org"}'
badgeest une URL, un JWS compact, ou le justificatif lui-même ;email(ourecipient) est ce à quoi on compare un destinataire haché. La réponse est202 {"status":"valid","signal":"accepted"}, ou200 {"status":"…","signal":"none"}quand le jeu ne déclare aucun signal pour ce verdict.
-
GET http://127.0.0.1:9304/healthrépond 200{"connector":"open-badge","ok":true,"detail":"form on port 8790",…}. - Le connecteur journalise
"event":"open-badge.verdict"avec le statut et le format ; le Bridge journalise"event":"pairing.confirmed", puis"event":"signal.accepted".
| Réponse | Cause | Correction |
|---|---|---|
422 {"error":"pairing-pairing"}
|
Le code est inconnu, expiré ou déjà utilisé : un code ne sert qu’une fois | Un nouveau code depuis le jeu |
400 {"error":"shape"}
|
Pas du JSON, ou pas de code
|
Poster { code, badge, email? }
|
202 avec "status":"indeterminate"
|
Une suite de preuve qu’il ne sait pas vérifier (eddsa-rdfc-2022…), ou un document qu’il n’a pas pu chercher sous sa politique |
Demander à l’émetteur un format pris en charge ; vérifier hosts
|
202 avec "status":"invalid"
|
Un autre émetteur que ceux du jeu, un destinataire qui ne correspond pas, une signature mauvaise ou faible | — |
413, ou 429 {"error":"rate"}
|
Un corps de plus de 64 Ko ; plus de 30 envois par minute depuis une adresse | — |
Rien sur disque. Les listes de révocation et de statut sont gardées en mémoire un jour au plus.
Arrêtez le processus (SIGTERM). Révoquez son jeton sur le Bridge s’il a fuité, et donnez-en un nouveau.
Limite ·
bridge-badge-code-onceUn code d’appairage ne sert qu’une fois. Chaque envoi demande un code que le jeu vient de montrer, et le confirmer lie le jeu à un nouveau joueur pseudonyme, comme tout appairage.
-
Open Badges 2.0 : hébergé (l’assertion recherchée de nouveau à partir de son propre id) ou signé (un JWS dont
l’émetteur possède la clé). 3.0 : un VC-JWT, ou une preuve Data Integrity
eddsa-jcs-2022; les autres suites, commeeddsa-rdfc-2022, sontindeterminate, jamaisvalid. - L’émetteur parmi les
issuersdu jeu ; le destinataire contre l’e-mail (haché avec le sel du badge, puis abandonné) ; les dates ; la révocation (listes de révocation OB2,1EdTechRevocationListOB3 et listes de statut Bitstring, gardées un jour au plus). - Depuis la 4.3.0, une clé trop faible pour son algorithme rend le badge
invalid(une clé RSA de moins de 2 048 bits, une autre courbe que P-256 pour ES256, autre chose qu’Ed25519 poureddsa-jcs-2022). - La clé est
sha256('open-badge:' + joueur + ':' + id du badge + ':' + verdict): le même badge avec le même verdict pour le même joueur fait un seul signal.
Chaque document est cherché sous une seule politique : https: seulement ; les hôtes de hosts (par défaut les hôtes
des émetteurs) ; le nom résolu une seule fois, et aucune adresse privée, de boucle locale, de lien local, multicast ou
non spécifiée (IPv4, IPv6 et IPv6 mappé IPv4) ; deux redirections au plus, chacune revérifiée ; 64 Ko ; 10 secondes ;
du JSON imbriqué sur 8 niveaux au plus ; @context jamais cherché.
Garantie ·
bridge-badge-network-policy· référencée · exécutée sur47dccf1b4b15· portée relue Une requête sanshttps:, vers un hôte hors liste, avec des identifiants dans son URL, ou dont le nom se résout vers une adresse privée est refusée, et un nom n’est résolu qu’une fois (pas de rebinding).
La section open-badge :
| Champ | Défaut | Sens |
|---|---|---|
port, host
|
—, 127.0.0.1
|
Où écoute POST /v1/badges
|
hosts |
les hôtes des émetteurs https: du jeu |
D’où les documents peuvent être cherchés |
perMinutePerIp |
30 | Envois par minute et par adresse |
maxBytes |
65 536 | Le corps d’un envoi |
Le badge et les documents vers lesquels il pointe sont cherchés, vérifiés puis abandonnés ; seul un verdict sort du
connecteur, sous forme de signal, avec une empreinte de l’id du badge et de l’émetteur en evidenceHash. L’e-mail
qu’un joueur donne pour correspondre à un destinataire haché est haché avec le sel du badge pour la comparaison, puis
abandonné : jamais gardé, journalisé ni envoyé. Les listes de révocation et de statut (celles d’un émetteur, pas d’une
personne) sont gardées un jour au plus. Les adresses qui postent sur le formulaire sont comptées en mémoire pendant
une minute (la limite de débit), puis oubliées.
- Le code :
connectors/src/badges/connector.ts,verify.ts,fetch.ts. - Le modèle de menace :
docs/dev/threat-models/open-badge.md. - Testé par
tests/connectors-badges.test.ts.
Generated publication · publication générée — current documentation · documentation courante: quest'n'click 4.5.4 r2, documentation revision · révision de la documentation 63112c877c587cc4fad16b25a3400408db2c36bd.
Latest documentation · dernière documentation: https://quest-n-click.cleverapps.io/docs · https://quest-n-click.cleverapps.io/fr/docs; earlier versions · versions précédentes: each release's quest-n-click-docs-<version>.tar.gz · l'archive quest-n-click-docs-<version>.tar.gz de chaque release, https://github.com/Quest-n-Click/quest-n-click/releases
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 (18)
- Prérequis
- Installer depuis l'archive de la release
- Installer depuis npm
- 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.5
- 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