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>
3.2 KiB
Runbook — Moodle LTI 1.3
6ᵉ façon de rejoindre une classe (V2, CLAUDE.md section 6) : un élève clique sur l'activité Moodle, atterrit connecté sur son tableau de bord Syllabus habituel. Détail des choix : ADR 0010.
Étape 1 — Côté Moodle : ajouter Syllabus comme outil externe
Administration du site → Plugins → Outils externes → Gérer les outils → Configurer un outil manuellement. Renseigner :
| Champ Moodle | Valeur |
|---|---|
| URL de l'outil | https://syllabuslab.fr/lti/lancement/<code de la classe> (visible sur la page de la classe, section « Lier à Moodle ») |
| LTI version | 1.3 |
| Initiate login URL | https://syllabuslab.fr/lti/connexion |
| Redirection URIs | la même URL de lancement que ci-dessus |
| Public key type | Clé publique au format JWKS |
| Jeu de clés publiques (URL) | https://syllabuslab.fr/lti/cles.json |
Après enregistrement, Moodle affiche un « Platform ID », un « Client ID », une « Public keyset URL », une « Access token URL » et une « Authentication request URL » — ce sont ces valeurs-là (celles de Moodle, pas les nôtres) qu'il faut passer à l'étape 2.
Étape 2 — Côté serveur : enregistrer la plateforme
ssh paillasse
cd /var/www/portail
sudo -u www-data HOME=/tmp php8.3 artisan lti:enregistrer-plateforme \
"<Platform ID affiché par Moodle>" \
"<Client ID affiché par Moodle>" \
"<Public keyset URL affichée par Moodle>" \
"<Access token URL affichée par Moodle>" \
"<Authentication request URL affichée par Moodle>"
La commande génère et stocke une paire de clés RSA pour le portail (jamais collée par Adam) et rappelle les deux adresses déjà saisies à l'étape 1.
Étape 3 — Ajouter l'outil à un cours, puis enregistrer le déploiement
Dans le cours Moodle : ajouter une activité « Outil externe » pointant vers Syllabus. Une fois ajoutée, Moodle affiche un Deployment ID pour cette combinaison outil/cours — à enregistrer :
sudo -u www-data HOME=/tmp php8.3 artisan lti:enregistrer-deploiement <id_plateforme> <deployment_id>
<id_plateforme> est l'identifiant numérique affiché à l'étape 2
(« Plateforme #… enregistrée »).
Vérifier que ça fonctionne
Un élève qui clique sur l'activité dans Moodle doit atterrir connecté sur
/eleve, dans la bonne classe. En cas d'échec, Moodle affiche en général
le message d'erreur renvoyé par le portail (page « Le lancement depuis
Moodle n'a pas fonctionné ») :
| Message | Cause probable |
|---|---|
| Classe introuvable ou archivée | Le code dans l'URL de lancement ne correspond à aucune classe active |
| LTI 1.3 Registration not found… | Étape 2 pas faite, ou Platform ID/Client ID mal recopiés |
| Unable to find deployment | Étape 3 pas faite pour ce cours précis |
| Please make sure you have cookies… | Cookies tiers bloqués côté navigateur de l'élève, ou horloge du serveur décalée |
Un élève change d'identité Moodle ou rejoint depuis deux cours
Peu probable, mais si ça arrive : un nouveau compte serait créé (l'élève
est retrouvé par lti_sub, propre à Moodle). Pas de fusion automatique —
à faire à la main si ça se produit réellement.