services/liveness_gate.py — Redis challenge/response (db=5, TTL=300s, jednokatran) · create_challenge(user_id) generira UUID token + 6-znamenkasti kod · verify_and_consume() — atomarna provjera + bris
tipimplementacija
chainc1403
prevc1401
sustavfenix-v4
serverMAR + EU
commitfca861c
sto_je_napravljeno[
"services/liveness_gate.py — Redis challenge/response (db=5, TTL=300s, jednokatran)",
"create_challenge(user_id) generira UUID token + 6-znamenkasti kod",
"verify_and_consume() — atomarna provjera + brisanje (one-time use)",
"POST /api/v4/archive/liveness-izazov — endpoint bez tijela, samo auth",
"zahtjev-spaljivanja: liveness_token REQUIRED (422 ako nije poslan)",
"zahtjev-spaljivanja: krivi/istekli token -> 403 + Kapetan ALARM",
"zahtjev-spaljivanja: fix user.company_id bug ->
testovi{
"T_L1_liveness_izazov": "200 token+code PASS",
"T_L2_bez_tokena": "422 required PASS",
"T_L3_krivi_token": "403 S1 fail PASS",
"T_L4_ispravni_token": "200 zahtjev OK PASS",
"T_L5_one_time_use": "403 vec potroseno PASS",
"T_L6_redis_direktno": "key+TTL+user_id match PASS",
"smoke_9_od_9": "PASS"
}
zakon{
"S1": "ZATVORENO — liveness gate aktivan na zahtjev-spaljivanja",
"ZAKON_41": "Nema tudjeg SDK — Redis + UUID, bez trece strane",
"Kapetan": "LIVENESS_MISS okidac: prijavi_liveness_miss + refleks ALARM"
}