Chapitre 10
API et module hors ligne
L'API REST sécurisée par jetons, ses durées et ses limites, et le fonctionnement du module hors ligne côté exploitation.
Concerne :Équipe technique
L'API REST#
La plateforme expose une API sous /api/v1. Elle sert d'abord au module hors ligne, et peut servir à d'autres outils de l'organisation. Elle passe par les mêmes services que le site, donc par les mêmes règles : rôle du compte, périmètre géographique, paramètre « saisie par les organisations », montants masqués selon le rôle.
| Réponse | Signification |
|---|---|
| 401 | Jeton absent, expiré ou révoqué (compte désactivé, droits ou mot de passe changés, appareil déconnecté) |
| 403 | Action non autorisée pour ce compte ; mot de passe temporaire à changer d'abord sur le site |
| 404 | Donnée hors du périmètre du compte, ou inexistante |
| 409 | Donnée modifiée entre-temps par quelqu'un d'autre |
| 429 | Trop d'appels depuis la même adresse IP |
Les erreurs sont au format ProblemDetails (JSON) ; les énumérations sont écrites en texte (par exemple "Realisee").
Points d'accès#
| Route | Méthodes | Usage |
|---|---|---|
/api/v1/jetons | POST | Connexion : jeton d'accès et jeton de renouvellement |
/api/v1/jetons/renouveler | POST | Nouveau couple de jetons ; le jeton présenté ne sert plus |
/api/v1/jetons/revoquer | POST | Déconnexion de l'appareil |
/api/v1/moi | GET | Profil du compte connecté |
/api/v1/referentiels | GET | Listes de saisie |
/api/v1/organisations, /api/v1/organisations/{id} | GET | Organisations visibles |
/api/v1/activites | GET, POST | Liste filtrée et paginée ; planification |
/api/v1/activites/a-rapporter | GET | Activités pour lesquelles le compte peut saisir un rapport |
/api/v1/activites/{id} | GET, PUT | Fiche, modification |
/api/v1/activites/{id}/statut | PUT | Avancement |
/api/v1/rapports | GET, POST | Liste ; saisie (brouillon, soumission ou validation) |
/api/v1/rapports/{id} | GET, PUT | Fiche, correction |
/api/v1/rapports/{id}/renvoi | POST | Renvoi d'un rapport à l'organisation (gestion) |
La description complète (OpenAPI) est servie sur /api/v1/openapi.json, aux comptes connectés seulement (par le site ou par jeton).
Jetons#
Le client obtient ses jetons par
POST /api/v1/jetonsavec l'identifiant et le mot de passe d'un compte :{ "identifiant": "personne@example.org", "motDePasse": "…", "appareil": "Téléphone de terrain 3" }- Il reçoit un jeton d'accès (
jetonAcces, valableexpireDansSecondes) à présenter dans l'en-têteAuthorization: Bearer <jeton>, et un jeton de renouvellement (jetonRenouvellement, valable jusqu'àrenouvellementExpireLe). - Avant l'expiration du jeton d'accès, il échange le jeton de renouvellement contre un nouveau couple (
/api/v1/jetons/renouveler).
| Règle | Valeur par défaut | Réglage |
|---|---|---|
| Durée du jeton d'accès | 30 minutes | Api__DureeJetonAccesMinutes |
| Durée du jeton de renouvellement, glissante | 14 jours | Api__DureeRenouvellementJours |
| Durée maximale avant de redemander le mot de passe | 90 jours | Api__DureeMaximaleJours |
| Rejeu toléré d'un jeton de renouvellement déjà utilisé | 2 minutes | Api__DelaiRejeuSecondes |
| Appels par minute et par adresse IP | 300 | Api__AppelsParMinute |
| Connexions et renouvellements par minute et par adresse IP | 10 | Securite__ConnexionsParMinute |
Sécurité des jetons :
- la zone
/apin'accepte que les jetons, jamais le cookie du site ; - le jeton de renouvellement est à usage unique et seule son empreinte est enregistrée en base ;
- un jeton de renouvellement présenté une seconde fois au-delà du délai de rejeu est considéré comme volé : tous les jetons de l'appareil sont révoqués ;
- le compte est revérifié à chaque appel : désactivation, changement de rôle ou de mot de passe coupent l'accès aussitôt ;
- les connexions par l'API sont inscrites au journal d'audit (canal « api ») et comptent dans les statistiques.
Les jetons expirés ou révoqués depuis plus de 30 jours sont supprimés par la tâche quotidienne.
Remarque
Il n'existe pas d'écran listant les appareils connectés. Pour couper l'accès d'un téléphone perdu, l'administrateur désactive le compte (ou change son mot de passe) : tous ses jetons sont refusés à l'appel suivant.
Le module hors ligne#
Le module (/terrain/) est une application WebAssembly installable (PWA), servie par la plateforme elle-même. Il est réservé aux comptes qui saisissent : l'équipe projet, et les organisations quand l'administrateur a ouvert la saisie aux organisations.
Ce qui est stocké sur le téléphone#
- l'application elle-même, en cache (service worker) : seules les adresses de
/terrain/passent par ce cache, l'API va toujours au réseau ; - dans le stockage du navigateur (IndexedDB) : le profil, les listes de saisie, les activités à rapporter (au plus 500 : sans rapport, non annulées, commençant dans les 30 jours ou terminées depuis 90 jours au plus), les brouillons de rapport et le jeton de renouvellement. Le jeton d'accès reste en mémoire seulement.
Les rapports validés sont retirés du téléphone 30 jours après leur validation. Se déconnecter de ce téléphone révoque les jetons sur la plateforme puis les efface de l'appareil.
Synchronisation#
L'envoi n'a lieu que module ouvert : au démarrage, au retour du réseau, toutes les 5 minutes tant que des rapports attendent, et sur Synchroniser maintenant. Un rapport envoyé deux fois (réponse perdue sur un réseau instable) n'est jamais dupliqué : la plateforme reconnaît son identifiant et renvoie le rapport existant.
Mise à jour du module#
Un déploiement de la plateforme publie aussi la nouvelle version du module. Sur chaque téléphone :
- à la connexion suivante avec du réseau, le service worker télécharge la nouvelle version ;
- le module affiche « Une nouvelle version du module est prête. » et le bouton Mettre à jour (les saisies en cours sont enregistrées d'abord) ;
- sans action de l'utilisateur, la nouvelle version s'active quand tous les onglets du module sont fermés.
Les fichiers du module sont servis avec Cache-Control: no-cache : le navigateur revérifie toujours la version disponible.
Important
Un déploiement qui change le format des données de l'API doit rester compatible avec l'ancienne version du module tant que des téléphones ne sont pas mis à jour : des rapports peuvent attendre plusieurs jours dans leur file.