Avancé 4 : Les jetons et leur portée¶
Objectif : qu'un capteur ne puisse écrire que ses propres mesures.
Un jeton par appareil, jamais un jeton pour tous¶
from forge_mvc_iot import generate_token, hash_token
jeton = generate_token() # à remettre à l'appareil, une seule fois
empreinte = hash_token(jeton) # à stocker en base
La base ne garde que l'empreinte.
Une fuite de la table ne donne donc aucun jeton utilisable, et un jeton perdu ne se retrouve pas : il se remplace.
Le jeton n'est montré qu'une fois
C'est le prix du stockage par empreinte, et c'est le bon prix.
Un jeton relisable en base est un jeton qu'une sauvegarde, un journal ou un écran d'administration peut divulguer.
La portée limite ce qu'un jeton peut faire¶
Un jeton de portée capteur-salle-201 ne peut pas écrire au nom d'un autre appareil.
La portée globale n'est pas un raccourci de développement
GLOBAL_SCOPE autorise à écrire au nom de n'importe quel appareil.
Elle a des usages, une passerelle qui relaie plusieurs capteurs par exemple, et un seul jeton global qui fuit permet d'injecter des mesures pour tout le parc.
La lecture se contrôle séparément
Écrire une mesure et lire les agrégats sont deux actions distinctes.
Un capteur écrit et ne lit pas ; un écran lit et n'écrit pas. is_read_allowed porte cette seconde question, et l'application y branche sa propre règle.
À retenir¶
- La base garde une empreinte, jamais le jeton.
- Une portée par appareil borne les dégâts d'une fuite.
- Lecture et écriture sont deux droits séparés.