Isolation par tenant
- Toute requête B2B est filtrée par
tenantId; les policies de Row Level Security de Supabase garantissent l'isolation en base de données. - Les clés 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 constitue un overlay en mémoire — l'authentification Supabase n'est jamais modifiée. Chaque début/fin d'usurpation est consigné dans l'audit.
Secrets & OAuth
- Le OAuth state est signé HMAC-SHA256 (
OAUTH_STATE_SECRET) avec un nonce Redis (anti-replay, TTL 15min) sur chaqueconnectet validé par rapport à la session sur chaquecallback. - Les mots de passe des liens de médias partagés sont stockés sous la forme
salt:hashvia scrypt, avec une limite de débit sur les tentatives.
Uploads & sécurité du contenu
- Le
storageUrld'upload doit commencer par le préfixe public de storage Supabase, sinon il est rejeté avec une erreur 422. - Les soumissions d'assignment sont stockées dans un bucket privé avec un 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 provenant des utilisateurs/LLM 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 IP 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, limite de débit de 1 req par 24h (cooldown Redis). - Suppression (Art. 18 VI) :
DELETE /api/user/accountanonymise les PII 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 le texte masqué et les médias bloqués pour la conformité LGPD.
Audit
Les actions administratives sensibles (usurpation d'identité, changement de plan/configuration, paiements manuels, changement de rôle) sont enregistrées dans un journal d'audit administratif immuable avec l'IP et le user-agent.