Moodle et LTI 1.3
Cette page documente l'intégration de Kutsum comme outil externe LTI 1.3 depuis Moodle.
Elle couvre :
- le cas de test local avec
docker/moodle - le cas d'une vraie instance Moodle
- les paramètres à recopier côté Kutsum
- les limites connues du flux actuel
Cas local : Moodle Docker
Le dépôt contient un environnement local dans docker/moodle/ pour tester le flux LTI 1.3 avec Kutsum.
Commandes :
cd docker/moodle
sudo docker compose up -d
Moodle est alors disponible sur http://localhost:8080.
Pour le flux multi-tenant local validé actuellement, le runbook retenu est :
cd app
FRONTEND_URL=http://utbm.kutsum.local:3008 npm run dev
cd docker/moodle
./configure-kutsum-tool.sh http://utbm.kutsum.local:3008
Pré-requis côté navigateur / OS :
http://app.kutsum.local:3008affiche la homepage standardhttp://utbm.kutsum.local:3008affiche la homepage tenant UTBMhttp://localhost:3008reste équivalent au tenant principalapp
Comptes de test :
| Rôle | Identifiant | Mot de passe |
|---|---|---|
| Admin Moodle | admin | admin123 |
| Enseignant de test | prof.test | Teacher123! |
| Élève de test | eleve.test | Student123! |
Outil LTI local après retargeting UTBM :
| Paramètre | Valeur |
|---|---|
| Tool URL | http://utbm.kutsum.local:3008 |
| Initiate login URL | http://localhost:3007/api/v1/lti/login |
| Redirect URI | http://localhost:3007/api/v1/lti/launch |
| Keyset URL (JWKS) | http://localhost:3007/api/v1/lti/jwks |
| Client ID Moodle | kutsum-lti-81ebd7458a9875b7 |
| Deployment ID | 1 |
Pourquoi ce split local :
- le navigateur Moodle peut joindre
localhost:3007directement pour/api/v1/lti/* - le backend Kutsum utilise ensuite
FRONTEND_URLpour sa redirection finale - pour tester le tenant UTBM,
FRONTEND_URLdoit donc pointer vershttp://utbm.kutsum.local:3008
Le script docker/moodle/configure-kutsum-tool.sh modifie la ligne Moodle persistée en base (mdl_lti_types.name = 'Kutsum') sans passer par l'UI.
Déclarer Kutsum dans une vraie instance Moodle
Chemin Moodle habituel :
Administration du site -> Plugins -> Modules d'activité -> Outil externe -> Gérer les outils
Checklist à envoyer à l'admin Moodle :
- créer un outil
LTI 1.3 - saisir les URLs Kutsum sur le host du tenant, pas sur
app.kutsum.org - transmettre ensuite à l'équipe Kutsum
issuer,clientId,deploymentId
Ce que Kutsum attend en retour :
issuer: URL canonique MoodleclientId: identifiant LTI généré par MoodledeploymentId: identifiant de déploiement LTI
Exemple pour :
- Moodle :
https://app.utbm.org - Tenant Kutsum :
https://utbm.kutsum.org
Valeurs à saisir dans Moodle :
| Champ Moodle | Valeur |
|---|---|
| Nom de l'outil | Kutsum UTBM |
| Version LTI | LTI 1.3 |
| URL de l'outil | https://utbm.kutsum.org/api/v1/lti/login |
| URL d'initiation de connexion | https://utbm.kutsum.org/api/v1/lti/login |
| URL du jeu de clés publiques | https://utbm.kutsum.org/api/v1/lti/jwks |
| URI(s) de redirection | https://utbm.kutsum.org/api/v1/lti/launch |
| Type de clé publique | Keyset URL |
| Imposer SSL | Oui |
| Prend en charge les liens profonds | Non |
Points importants :
clientIdetdeploymentIdne doivent pas être inventés.- si Moodle ne les montre pas au moment de la création, la source la plus fiable est la requête envoyée vers
/api/v1/lti/login - Kutsum n'implémente pas aujourd'hui le flux LTI Deep Linking
- toutes les URLs doivent être en
https
Configuration côté Kutsum
Le config JSON du provider LTI_13 doit ressembler à ceci :
{
"issuer": "https://app.utbm.org",
"clientId": "<CLIENT_ID_MOODLE>",
"deploymentId": "<DEPLOYMENT_ID_MOODLE>",
"oidcAuthUrl": "https://app.utbm.org/mod/lti/auth.php",
"jwksUri": "https://app.utbm.org/mod/lti/certs.php",
"tokenUrl": "https://app.utbm.org/mod/lti/token.php",
"authorizationUrl": "https://app.utbm.org/mod/lti/auth.php",
"redirectUri": "https://utbm.kutsum.org/api/v1/lti/launch"
}
En production, ce provider doit aussi contenir la paire de clés LTI Kutsum :
ltiKeyIdltiPublicJwkltiPrivateKeyEncryptedltiPrivateKeyVersion
Ces champs sont générés à partir de LTI_MASTER_KEY puis stockés dans le provider IdentityProvider actif.
Diagnostic rapide quand Moodle échoue immédiatement
Si Moodle ouvre directement une erreur Unknown LTI issuer or client_id, le backend Kutsum renvoie maintenant aussi les identifiants reçus :
{
"error": "Unknown LTI issuer or client_id",
"received": {
"iss": "https://app.utbm.org",
"client_id": "...",
"lti_deployment_id": "..."
}
}
Cela permet de recopier exactement les valeurs à enregistrer dans le provider LTI Kutsum, sans devoir intercepter la requête réseau au vol.
Redirection LTI post-launch tenant-aware
La redirection post-launch dérive automatiquement l'URL frontend du tenant à partir du sous-domaine de l'organisation LTI (Organization.subdomain) et de la valeur de FRONTEND_URL configurée sur le backend.
Principe : si FRONTEND_URL=https://app.kutsum.org et que le launch provient d'un IdentityProvider rattaché à l'org dont le sous-domaine est utbm, la redirection finale pointe vers https://utbm.kutsum.org, pas vers https://app.kutsum.org.
Pré-requis :
FRONTEND_URLdoit utiliser le format{subdomain}.domaine.tld(avec au moins 3 segments dans le hostname) pour que la dérivation fonctionne.- En développement local, utiliser
FRONTEND_URL=http://app.kutsum.local:3008dansapp/backend/.env(et nonhttp://localhost:3008). - Chaque tenant doit avoir son propre
IdentityProvideravec unclientIddistinct dans Moodle.
Pour provisionner le tenant UTBM en local (idempotent) :
cd docker/moodle
bash provision-utbm-tenant.sh
Ce script crée un outil Moodle LTI dédié (clientId=kutsum-lti-utbm-dev), une activité LTI dans le cours de test, et l'IdentityProvider correspondant en DB. le backend avec FRONTEND_URL=http://utbm.kutsum.local:3008.