1 Systeme-Anti-Triche
tarzzan edited this page 2026-05-20 03:04:22 +00:00

🔒 Système Anti-Triche

QR code rotatif, tokens uniques et mécanismes de protection de la file.


Problématique

Dans une file d'attente classique (numéro papier), plusieurs fraudes sont possibles :

Fraude Description Impact
Partage de lien Un patient partage le lien d'inscription à un ami L'ami rejoint sans être présent
Inscription à distance Un patient s'inscrit depuis chez lui Occupe une place sans être là
Double inscription Un patient s'inscrit plusieurs fois Monopolise la file
Usurpation Quelqu'un prend la place d'un autre Injustice pour les autres

Solution : Token QR Rotatif

Principe

Le QR code affiché au cabinet contient un token unique qui change régulièrement. Pour rejoindre la file, le patient doit scanner le QR code physiquement présent au cabinet.

┌─────────────────────────────────────────────────────────────────────────┐
│                                                                         │
│  ROTATION DU TOKEN QR (exemple : toutes les 30 minutes)                 │
│                                                                         │
│  08:00          08:30          09:00          09:30          10:00      │
│    │              │              │              │              │         │
│    ▼              ▼              ▼              ▼              ▼         │
│  ┌────┐        ┌────┐        ┌────┐        ┌────┐        ┌────┐       │
│  │ T1 │        │ T2 │        │ T3 │        │ T4 │        │ T5 │       │
│  └────┘        └────┘        └────┘        └────┘        └────┘       │
│    │              │              │              │              │         │
│    │              │              │              │              │         │
│    ▼              ▼              ▼              ▼              ▼         │
│  QR code       QR code       QR code       QR code       QR code      │
│  affiché       affiché       affiché       affiché       affiché      │
│  change        change        change        change        change       │
│                                                                         │
│  ═══════════════════════════════════════════════════════════════════    │
│                                                                         │
│  Patient A scanne T2 à 08:45 → ✅ Token valide → Rejoint la file       │
│  Patient A partage le lien à 09:05 → ❌ T2 expiré → Rejeté             │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

Fonctionnement Technique

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│  1. GÉNÉRATION                                                  │
│     ┌──────────────────────────────────────────────────────┐   │
│     │ qrToken = crypto.randomBytes(32).toString('hex')     │   │
│     │ qrTokenExpiresAt = now() + rotationMinutes           │   │
│     │ → Stocké dans table `clinics`                        │   │
│     └──────────────────────────────────────────────────────┘   │
│                                                                 │
│  2. ENCODAGE DANS LE QR CODE                                    │
│     ┌──────────────────────────────────────────────────────┐   │
│     │ URL = https://app.queuemed.fr/queue/{qrToken}        │   │
│     │ → Le token EST l'URL d'accès                         │   │
│     └──────────────────────────────────────────────────────┘   │
│                                                                 │
│  3. VALIDATION À L'INSCRIPTION                                  │
│     ┌──────────────────────────────────────────────────────┐   │
│     │ if (clinic.qrToken !== submittedToken) → ❌ REJETÉ    │   │
│     │ if (clinic.qrTokenExpiresAt < now()) → ❌ EXPIRÉ      │   │
│     │ else → ✅ ACCEPTÉ, créer queueEntry                   │   │
│     └──────────────────────────────────────────────────────┘   │
│                                                                 │
│  4. ROTATION AUTOMATIQUE                                        │
│     ┌──────────────────────────────────────────────────────┐   │
│     │ Toutes les N minutes (configurable par cabinet) :    │   │
│     │ → Nouveau token généré                               │   │
│     │ → QR code affiché se met à jour                      │   │
│     │ → Anciens liens deviennent invalides                 │   │
│     └──────────────────────────────────────────────────────┘   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Configuration par Cabinet

Le médecin peut configurer la fréquence de rotation pour chaque cabinet :

Fréquence Cas d'usage Sécurité UX Patient
5 min Cabinet très fréquenté, risque de fraude élevé 🟢🟢🟢 Maximale ⚠️ QR change souvent
15 min Cabinet standard, bonne affluence 🟢🟢 Élevée 🟢 Confortable
30 min Cabinet calme, risque faible (défaut) 🟢 Bonne 🟢🟢 Très confortable
60 min Cabinet peu fréquenté 🟡 Modérée 🟢🟢🟢 Aucune gêne
24h Cabinet de confiance, pas de fraude 🔴 Minimale 🟢🟢🟢 Aucune gêne
0 (désactivé) Pas de rotation Aucune

Recommandation

Pour la plupart des cabinets, 30 minutes offre le meilleur compromis entre sécurité et confort d'utilisation.


Protections Supplémentaires

Anti-Double Inscription

Patient scanne le QR code
         │
         ▼
┌─────────────────────────────────────────┐
│ Vérification du patientToken existant   │
│                                         │
│ SELECT * FROM queue_entries             │
│ WHERE clinicId = ? AND patientToken = ? │
│ AND status IN ('waiting', 'called')     │
├─────────────────────────────────────────┤
│                                         │
│ Résultat trouvé ? ──── OUI ──▶ ❌ Déjà  │
│       │                         inscrit │
│      NON                                │
│       │                                 │
│       ▼                                 │
│ ✅ Créer nouvelle entrée                 │
│                                         │
└─────────────────────────────────────────┘

Token Patient Unique

Chaque patient reçoit un patientToken unique (cookie de session) qui empêche :

  • La double inscription depuis le même appareil
  • L'usurpation de position d'un autre patient

Taille Maximum de File

Paramètre Défaut Description
maxQueueSize 50 Nombre max de patients en attente

Quand la file est pleine, les nouveaux patients voient un message :

┌─────────────────────────────────────────┐
│                                         │
│  ⚠️ File d'attente complète              │
│                                         │
│  Le cabinet a atteint sa capacité       │
│  maximale. Veuillez réessayer plus      │
│  tard ou contacter le cabinet.          │
│                                         │
└─────────────────────────────────────────┘

Rotation Manuelle

Le médecin peut forcer une rotation immédiate du token QR depuis l'interface :

Bouton "🔄 Forcer rotation" dans la fiche cabinet
         │
         ▼
┌─────────────────────────────────────────┐
│ 1. Génère un nouveau token aléatoire   │
│ 2. Met à jour qrToken en DB            │
│ 3. Recalcule qrTokenExpiresAt          │
│ 4. Le QR code affiché change           │
│ 5. Anciens liens → invalides           │
└─────────────────────────────────────────┘

Cas d'usage : Si le médecin suspecte qu'un patient a partagé le lien, il peut forcer la rotation pour invalider immédiatement tous les anciens liens.


Scénarios de Fraude et Réponses

Scénario Tentative Réponse QueueMed
Partage de lien WhatsApp Patient A envoie le lien à Patient B Token expiré → B rejeté
Screenshot du QR Photo du QR envoyée à distance Token expiré → Rejeté
Inscription depuis chez soi Patient connaît l'URL du cabinet Token requis → Impossible
Bot d'inscription Script automatisé Rate limiting + token
Double inscription Même patient, 2 appareils patientToken unique → Bloqué

Limites Connues

Limite Description Mitigation
Fenêtre de validité Pendant la durée du token, le lien fonctionne Réduire la rotation
Même réseau WiFi Partage possible si même réseau Rotation courte
Présence physique Ne vérifie pas la géolocalisation Rotation + surveillance

Note : Le système anti-triche n'est pas infaillible mais rend la fraude suffisamment difficile pour décourager la grande majorité des tentatives. La rotation courte (5-15 min) est recommandée pour les cabinets à risque.