API key: salvata in chiaro e senza scadenza #41
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
COSA:
users.api_keyè in chiaro nel DB e non scade (src/backend/services/auth_service.py, src/backend/models/orm/user.py:35). Da #25 la key è riusata fra postazioni dello stesso utente, quindi vive più a lungo di prima.CRITERIO DI FATTO: key salvata come hash (SHA-256), confronto sull'hash, TTL configurabile con rinnovo all'uso, migrazione Alembic che invalida le key esistenti. Escluso dichiaratamente dall'analisi di #25.
ORIGINE: residui dichiarati alla chiusura delle issue della revisione del 21/09/2026.
⚡ jeeg — preso in carico 2026-10-06T09:23:12Z
ramo:
lavoro/jeeg· capacità: docker, gpu, systemdESITO: richiesta
RIF: gitea:Adriano/TieMeasureFlow#41
COSA: analisi (passo 1). API key salvate come hash SHA-256, una per sessione, con TTL che si rinnova all'uso.
NODO: login_user (src/backend/services/auth_service.py:78) oggi RIUSA la key esistente perché lo stesso account lavora da più postazioni (#25). Con l'hash la key in chiaro non si può più restituire, quindi: UNA KEY PER LOGIN, in una tabella nuova. Ogni postazione ha la sua key, e il requisito di #25 resta soddisfatto (nessun login butta fuori un'altra postazione).
FILE:
TEMPO: le date nuove sono UTC naive: datetime.now(timezone.utc).replace(tzinfo=None). La #42 porterà tutto il DB a UTC, quindi niente datetime.now() locale qui.
TEST: login due volte con lo stesso utente dà due key diverse, e tutte e due valgono; nel DB c'è l'hash, mai il chiaro; key scaduta = 401; l'uso rinnova expires_at; logout toglie solo la sua key, all_sessions tutte; cambio password e disattivazione invalidano tutte le key; regenerate invalida le vecchie; la migrazione 015 su SQLite fa upgrade e downgrade. I test esistenti che mettono api_key=... su User vanno adattati (conftest e helper).
NON TOCCARE: frontend Flask (riceve la key dal login come oggi, nessun cambio di contratto); vision_worker; la #42 (gli altri datetime).
FATTO SE: uv run pytest verde, nessun riferimento a User.api_key (grep ".api_key\b" in src/backend senza risultati, a parte lo schema di risposta del login).
Soluzione
ESITO: fatto
COMMIT:
35f4692,0d004c4su V3.0.0 (ramo lavoro/jeeg-tmf41)COSA: le API key si salvano come hash SHA-256, una per login, con TTL che si rinnova all'uso.
FILE:
AL DEPLOY: la migrazione invalida tutte le key esistenti, quindi tutti rifanno il login una volta.
PROVA: uv run pytest → 647 passed, 4 skipped (con #43 e #40). Migrazione 015 provata su SQLite (upgrade e downgrade), non su MySQL.