Add "Systeme-Anti-Triche"
parent
d2a4b04da6
commit
a07089ce2c
1 changed files with 212 additions and 0 deletions
212
Systeme-Anti-Triche.-.md
Normal file
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>
|
||||
Loading…
Add table
Add a link
Reference in a new issue