ajoute Moodle LTI 1.3 (V2), une 6e façon de rejoindre une classe
LTI authentifie l'élève et le fait rejoindre sa classe (même code que le code/QR existant), pas lancer un lab précis - relecture du CLAUDE.md qui liste LTI avec les autres façons d'ajouter des élèves. packbackbooks/lti-1p3-tool (Apache-2.0, recommandé par le CLAUDE.md), trois ponts vers Redis/cookies/MariaDB, élève retrouvé par identité Moodle stable pour ne jamais créer de doublon. Enregistrement d'une plateforme/d'un déploiement par commande Artisan (opération rare, faite à la main par Adam), jamais une page d'administration. Corrige au passage un vrai bug préexistant trouvé en vérifiant en réel sur le serveur : withoutMiddleware(ValidateCsrfToken::class) sur une route ne retire jamais le vrai middleware CSRF (ValidateCsrfToken est un alias déprécié de PreventRequestForgery, pas la classe réellement enregistrée) - /csp-rapport avait le même défaut depuis l'étape 14, invisible faute de surveillance. Corrigé pour les deux par la bonne méthode (validateCsrfTokens except, dans bootstrap/app.php). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
777dd1cbc8
commit
91d7cde4c1
27 changed files with 1293 additions and 9 deletions
|
|
@ -1274,3 +1274,27 @@ Le réflexe acquis avec Ceph et WebDAV (vérifier l'état réel avant d'agir, me
|
|||
**Suite**
|
||||
|
||||
Bloc C restant : WebDAV et Ceph faits, Elasticsearch fait. ElasticSearch avait été écarté du MCP développeurs par Adam (pas pour l'instant). Prochains chantiers confirmés par Adam : LTI Moodle 1.3, puis SSO ENT (Keycloak) — normalement des étapes V2/V3 du produit, avancées à la demande explicite d'Adam.
|
||||
|
||||
## 2026-10-14 — LTI Moodle 1.3, avancé en V2 (sur demande d'Adam)
|
||||
|
||||
Bloc C terminé. Adam a demandé d'avancer directement sur la V2 : LTI Moodle 1.3, puis SSO ENT. Détail des choix : [ADR 0010](adr/0010-lti-moodle-comme-sixieme-facon-de-rejoindre.md), marche à suivre : `docs/runbooks/lti-moodle.md`.
|
||||
|
||||
**Fait**
|
||||
|
||||
- Relu le CLAUDE.md avant de commencer : « Moodle LTI 1.3 » est listé avec les autres façons d'ajouter des élèves (code/QR, CSV…), pas avec l'espace de lab — a recadré toute la conception : LTI fait simplement rejoindre une classe (comme le code/QR existant), pas lancer un lab précis.
|
||||
- `packbackbooks/lti-1p3-tool` (Apache-2.0, recommandé par le CLAUDE.md) : trois ponts vers Redis/cookies/MariaDB (`App\Services\Lti\{CacheLti,CookieLti,DatabaseLti}`), deux nouvelles tables (`lti_plateformes`, `lti_deploiements`), deux colonnes sur `eleves` (`lti_emetteur`, `lti_sub`, pour retrouver le même élève à chaque lancement sans créer de doublon).
|
||||
- URL de lancement par classe : `https://syllabuslab.fr/lti/lancement/<code_classe>` — réutilise le code déjà affiché pour « Faire rejoindre tes élèves », pas un nouveau concept. Visible sur la page de la classe, section « Lier à Moodle ».
|
||||
- Élève provisionné automatiquement au premier lancement (prénom/nom lus dans les claims Moodle, jamais inventés ; « Élève »/« Moodle » si Moodle n'en envoie pas), retrouvé ensuite par identité Moodle stable — jamais de compte en double.
|
||||
- Deux commandes Artisan (`lti:enregistrer-plateforme`, `lti:enregistrer-deploiement`) : l'enregistrement d'un Moodle est une opération rare, faite à la main par Adam avec des informations lues dans l'administration Moodle — jamais une page web pour ça (CLAUDE.md : pas de fonctionnalité sans besoin réel).
|
||||
- Cookie d'état OIDC en `SameSite=None; Secure` : sans ça, le cookie ne survit jamais au POST final que Moodle envoie depuis son propre domaine — repéré en lisant le code de la bibliothèque (son message d'erreur dédié à ce cas précis), pas après un échec en vrai.
|
||||
- 7 tests Pest, dont un lancement **réellement signé** de bout en bout (vraie paire de clés RSA générée dans le test, jeu de clés de « Moodle » simulé par un faux connecteur de service) : élève créé avec le bon prénom/nom, un deuxième lancement du même élève ne crée pas de deuxième compte, classe inconnue/archivée affiche une erreur propre au lieu d'une 500.
|
||||
|
||||
**Comprendre**
|
||||
|
||||
Pas de vrai Moodle pour vérifier ce chantier en conditions réelles (contrairement à Ceph/WebDAV/Elasticsearch, tous vérifiés sur le vrai serveur) — la bibliothèque LTI elle-même construit ses propres tests avec un jeton signé et un jeu de clés simulé plutôt qu'un vrai IMS Validator, et j'ai repris exactement ce principe : le test ne fait confiance à rien de magique, il signe un vrai jeton avec une vraie clé et vérifie que le portail le valide et en tire les bonnes conséquences. C'est la meilleure vérification possible sans Moodle réel, mais ça reste noté en dette — un vrai lancement Moodle peut révéler des détails qu'aucune bibliothèque de test ne reproduit (comportement des cookies tiers d'un vrai navigateur, en particulier).
|
||||
|
||||
**Bug préexistant trouvé en vérifiant en réel sur le serveur** : `/lti/lancement` répondait 419 (jeton CSRF) malgré un `->withoutMiddleware(ValidateCsrfToken::class)` posé sur la route — jamais vu en local, les tests Pest ne passent jamais par le vrai middleware CSRF. Cause : `ValidateCsrfToken` est une classe dépréciée, simple alias de `PreventRequestForgery` (la vraie classe réellement enregistrée dans le groupe `web`) — `withoutMiddleware` compare des noms de classe exacts, et ne retirait donc jamais la bonne. `/csp-rapport` avait exactement le même défaut depuis l'étape 14, invisible faute de surveillance de ses échecs (un navigateur qui échoue à poster un rapport CSP ne prévient personne). Corrigé pour les deux à la fois, par la vraie méthode (`$middleware->validateCsrfTokens(except: [...])` dans `bootstrap/app.php`), vérifié en réel après coup : les trois routes (`csp-rapport`, `lti/connexion`, `lti/lancement`) répondent maintenant comme attendu (204/400/200) au lieu de 419.
|
||||
|
||||
**Suite**
|
||||
|
||||
Prochain, confirmé par Adam : SSO ENT (Keycloak), V3 du CLAUDE.md.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue