Isolation par tenant
- Toute requête B2B filtre par
tenantId; les policies Row Level Security de Supabase garantissent l'isolation au niveau de la base de données. - Les clés d'API par tenant, les identifiants des fournisseurs vidéo/avatar et les tokens OAuth sont chiffrés au repos avec AES-256-GCM.
- L'usurpation d'identité pour le support utilise un cookie httpOnly signé HMAC, de courte durée (1h), et est un overlay en mémoire — l'authentification Supabase n'est jamais modifiée. Chaque démarrage/arrêt d'usurpation est audité.
Secrets & OAuth
- L'OAuth state est signé HMAC-SHA256 (
OAUTH_STATE_SECRET) avec un nonce Redis (anti-replay, TTL 15min) à chaqueconnectet validé par rapport à la session à chaquecallback. - Les mots de passe des liens de médias partagés sont stockés sous forme de
salt:hashvia scrypt, avec un rate limit sur les tentatives.
Uploads & sécurité du contenu
- Le
storageUrld'upload doit commencer par le préfixe public de storage de Supabase, sinon il est rejeté avec un 422. - Les soumissions d'assignment sont stockées dans un bucket privé avec préfixe validé (
{tenantId}/{courseId}/{lessonId}/{userId}/) ; les téléchargements utilisent des URLs signées temporaires avec vérification de propriété. - Le HTML des utilisateurs/LLMs est assaini côté serveur (DOMPurify) avant tout
dangerouslySetInnerHTML, y compris le HTML servi à l'application mobile. - Les entrées sont validées avec Zod sur les routes POST/PATCH ; la prévention SSRF bloque les IPs privées IPv4/IPv6 et les endpoints de métadonnées.
Modération
Un superviseur de chat IA classe les tours du tuteur (sévérité + catégorie) en arrière-plan et peut avertir ou mettre en quarantaine ; les signaux d'automutilation déclenchent un flux de sécurité non-punitif avec des ressources de crise et une notification urgente à l'administrateur.
LGPD / confidentialité
- Export (Art. 18 IV) :
GET /api/user/data-exportretourne toutes les données de l'utilisateur en JSON, rate limit de 1 req par 24h (cooldown Redis). - Suppression (Art. 18 VI) :
DELETE /api/user/accountanonymise les données personnelles et supprime les données conversationnelles, mais conserve les données d'apprentissage (notes, complétions, tentatives de quiz) pendant ~5 ans de rétention fiscale (Art. 16 I). - Pages publiques
/privacyet/termsaccessibles sans authentification. - L'observabilité via Sentry utilise Replay avec texte masqué et médias bloqués pour la conformité LGPD.
Audit
Les actions administratives sensibles (usurpation d'identité, modification de plan/configuration, paiements manuels, changement de rôle) sont enregistrées dans un audit log administratif immuable avec adresse IP et user-agent.