Add "Systeme-Anti-Triche"

tarzzan 2026-05-20 03:04:22 +00:00
parent d2a4b04da6
commit a07089ce2c

212
Systeme-Anti-Triche.-.md Normal file

@ -0,0 +1,212 @@
# 🔒 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.
---
<div align="center">
**[[Home]] | [[Architecture-Technique]] | [[Temps-Reel]] | [[Guide-Patient]]**
</div>