Table of Contents
🔒 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.
🏥 QueueMed
Navigation
📖 Général
👥 Guides Utilisateur
⚙️ Technique
📊 Fonctionnalités
🔗 Liens Rapides
🏥 QueueMed — Gestion intelligente de file d'attente médicale | Développé par tarzzan | git.cosmolan.fr