Auth autonome pur HTTP via /gw/refresh (sans navigateur)

Le refresh du token passe désormais par POST /gw/refresh (l'endpoint que la
SPA appelle) au lieu d'un navigateur headless : pur httpx, refresh_token rotaté
persisté dans token.json, fenêtre 60j remise à zéro à chaque refresh. Lock
single-flight pour la rotation. get_token()/auth_status() tentent /gw/refresh
avant le filet Playwright. Homelab allumé = authentifié indéfiniment, sans re-sync.
This commit is contained in:
jerem
2026-06-18 12:06:42 +02:00
parent e37a27cc1a
commit e7776a539e
3 changed files with 121 additions and 10 deletions

View File

@@ -16,9 +16,10 @@ détails batch `recipes/recipes?ids=…`), filtrage coco (4/85 détectées, faux
internes neutralisés), proposition classée, et **écriture réelle réussie** (`PUT /v1/carts/{week}`,
HTTP 200) — sélection par index de course, ids de compte dérivés dynamiquement.
**Auth headless durable** : le token (30 min) est rafraîchi par un navigateur headless chargé
avec la session (`storage_state.json`, refresh ~60 j) — contourne la protection anti-bot des
endpoints OAuth. Aucune intervention pendant ~60 j ; la session « roule » à chaque refresh.
**Auth autonome (pur HTTP)** : le token (30 min) est rafraîchi par un simple `POST /gw/refresh`
(le endpoint que la SPA appelle), **sans navigateur**. Le refresh_token roule par fenêtres de 60 j,
remises à zéro à chaque refresh → un homelab allumé reste authentifié **indéfiniment**, sans
intervention ni re-sync. Le navigateur headless ne sert plus que de filet de secours.
> ⚠️ La connexion **directe** automatisée (Playwright/Chromium qui remplit le formulaire) est
> bloquée par l'anti-bot HelloFresh. La session se crée donc via **attache CDP à ton vrai Chrome**
@@ -28,7 +29,7 @@ endpoints OAuth. Aucune intervention pendant ~60 j ; la session « roule » à c
```
Hermes ──HTTP──▶ server.py (FastMCP, :9200/mcp)
├─ hellofresh/auth.py session storage_state + refresh token headless
├─ hellofresh/auth.py session storage_state + refresh HTTP /gw/refresh
├─ hellofresh/api.py httpx : menu, détails, deliveries, PUT cart
├─ hellofresh/filter.py exclusion (coco !) + scoring préférences
└─ config/ excludes.json · prefs.json · endpoints.json