Paillasse/portail/app/Console/Commands/EnregistrerPlateformeLti.php
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

59 lines
2.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Console\Commands;
use App\Models\LtiPlateforme;
use Illuminate\Console\Command;
use Illuminate\Support\Str;
// phpseclib/phpseclib ^4.0 est installé (composer.lock) : son espace de
// noms est phpseclib4, pas phpseclib3 (contrairement à la bibliothèque LTI
// elle-même, qui gère les deux — voir Packback\Lti1p3\JwksEndpoint).
use phpseclib4\Crypt\RSA;
/**
* Enregistre un établissement Moodle (V2, CLAUDE.md section 6) : à lancer
* une fois par Moodle, avec les informations que Moodle affiche après
* qu'Adam y a ajouté « Syllabus » comme outil externe LTI 1.3 (menu
* Administration du site > Plugins > Outils externes > Gérer les outils).
* Jamais les identifiants d'un élève ou d'un prof ; toujours ceux
* qu'Adam lit lui-même dans l'administration Moodle.
*/
class EnregistrerPlateformeLti extends Command
{
protected $signature = 'lti:enregistrer-plateforme
{emetteur : « Platform ID » affiché par Moodle}
{client_id : « Client ID » affiché par Moodle}
{url_jeu_cles : « Public keyset URL » affichée par Moodle}
{url_jeton_auth : « Access token URL » affichée par Moodle}
{url_connexion_auth : « Authentication request URL » affichée par Moodle}
{serveur_auth? : « Authentication server » — facultatif, souvent identique à l’émetteur}';
protected $description = 'Enregistre un établissement Moodle (plateforme LTI 1.3)';
public function handle(): void
{
$clePrivee = RSA::createKey(2048)->toString('PKCS8');
$kid = Str::random(16);
$plateforme = LtiPlateforme::create([
'emetteur' => $this->argument('emetteur'),
'client_id' => $this->argument('client_id'),
'url_jeu_cles' => $this->argument('url_jeu_cles'),
'url_jeton_auth' => $this->argument('url_jeton_auth'),
'url_connexion_auth' => $this->argument('url_connexion_auth'),
'serveur_auth' => $this->argument('serveur_auth'),
'cle_privee_outil' => $clePrivee,
'identifiant_cle' => $kid,
]);
$this->info("Plateforme #{$plateforme->id} enregistrée.");
$this->newLine();
$this->line('À saisir côté Moodle, dans la configuration de l’outil externe :');
$this->line(' Initiate login URL : '.route('lti.connexion'));
$this->line(' Public keyset URL (JWKS) : '.route('lti.cles'));
$this->newLine();
$this->line('Ensuite, pour chaque cours où l’outil est ajouté, Moodle affiche un');
$this->line('« Deployment ID » à enregistrer avec :');
$this->line(" php artisan lti:enregistrer-deploiement {$plateforme->id} <deployment_id>");
}
}