Paillasse/docs/runbooks/lti-moodle.md
Adam Belkacemi 91d7cde4c1 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>
2026-10-14 13:51:47 +02:00

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.