{"id":"c0866","filename":"c0866_sesija_20260515_genesis_identity_fix.dok.json","weise3_id":"","tip":"SESIJA_LOG","naziv":"Sesija 2026-05-15 DIO 5 — Genesis Identity login popravak","kreator":"CC-Sonnet","datum":"2026-05-15","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"SESIJA_LOG","naziv":"Sesija 2026-05-15 DIO 5 — Genesis Identity login popravak","datum":"2026-05-15","autor":"CC-Sonnet","kontekst":"Ivan pitao kako je riješena prijava na digigraf.online (PIN ili genesis app). Analiza otkrila 3 buga u Genesis Identity login toku.","analiza_prije_popravka":{"login_opcije":["Vozač sam za sebe — Ed25519 keypair u browseru, fallback device UUID, 7 dana","Prijava PIN-om — fleet_code + username + 4-6 znakova PIN, 24h, za vozače u floti","Imam fleet kod — Ed25519 + pridruživanje floti","Kreiram flotu — vlasnik/dispečer kreira novu flotu","Genesis Identity — genesislogin.online popup, Ed25519 ili PIN, SSO protokol"],"arhitektura_sso":{"frontend_app_js":"_loginViaGenesisPopup() otvara popup na genesislogin.online/auth/popup?origin=...&state=...","popup_html":"Serviran iz /var/www/genesis/public/login/popup.html (NE iz /var/www/genesislogin/pwa/popup.html)","povratni_kanal_desktop":"window.opener.postMessage({type: GENESIS_AUTH_RESULT, payload}, origin)","povratni_kanal_mobile":"redirect na ?gl_return=1&session_token=...&weise3_id=...&state=...","povratni_kanal_fallback":"POST /api/v1/genesis/auth/sso-relay → Redis TTL 300s; poll GET /sso-poll svaki 800ms"}},"bugovi_pronadjeni":[{"redni":"BUG-1","ozbiljnost":"KRITIČAN","naziv":"Firefox/Safari: token izgubljen kad opener=null","opis":"onSuccess() u popup.html imao je 3 grane: postMessage (Chrome/Edge), redirect (mobile), else → window.location.href = GENESIS_BASE + '/v/'. Na Firefoxu i Safariju strict mod window.opener je null — postMessage preskočen, redirect nema jer desktop — popup je otišao na /v/ i token zauvijek izgubljen. Korisnik dobiva prazan ekran, nije prijavljen.","fajl":"public/login/popup.html — onSuccess() setTimeout blok"},{"redni":"BUG-2","ozbiljnost":"KRITIČAN","naziv":"weise3_id nije vraćen iz prijava endpointa","opis":"/api/v1/auth/prijava (PIN login za interni genesis ERP) vraćao {token, korisnik, ime, uloga} — BEZ weise3_id. onSuccess() čita data.weise3_id || data.genesis_weise3_id, oba su undefined → tg_weise3_id u localStorage ostaje prazan string. Tahograf app tada ne zna tko je korisnik — sve API pozivi idu s praznim weise3_id.","fajl":"api/auth.py — prijava endpoint return blok"},{"redni":"BUG-3","ozbiljnost":"VISOK","naziv":"Ed25519 handler ne prosljeđuje weise3_id","opis":"Ed25519 tab u popupu poziva GenesisAuth.login() koji vraća {token, weise3_id}. Handler je zvao onSuccess({token: r.token, korisnik: ..., ime: ..., uloga: 'noble'}) — bez weise3_id: r.weise3_id. Rezultat: isti problem kao BUG-2, korisnik prijavljen ali bez identiteta.","fajl":"public/login/popup.html — btnEd.onclick handler"}],"popravci":[{"bug":"BUG-1","rjesenje":"Dodan SSO relay kao fire-and-forget PRIJE setTimeout bloka. Kad imamo state parametar, odmah šaljemo POST /api/v1/genesis/auth/sso-relay. U setTimeout dodana 4. grana: else if(state) { window.close(); } — relay je već pohranjen u Redis, poller u app.js pokupi ga unutar 800ms.","kod":"if(state) { fetch(GENESIS_BASE + '/api/v1/genesis/auth/sso-relay', {...}).catch(function(){}); }"},{"bug":"BUG-2","rjesenje":"auth.py prijava endpoint sada vraća weise3_id (deterministički SHA3-256 iz 'INTERNAL::korisnik::GENESIS2026'), session_token (alias za token — popup.html čita oba), display_name.","response_novi":"{token, session_token, korisnik, ime, uloga, weise3_id, display_name}"},{"bug":"BUG-3","rjesenje":"Ed25519 handler proširen: onSuccess({..., weise3_id: r.weise3_id||'', session_token: r.token, auth_method: 'ed25519'})"}],"verifikacija":["curl POST /api/v1/auth/prijava demo/123123 → weise3_id: '72d453d6...' OK","curl POST /api/v1/genesis/auth/sso-relay state=test1234567890 → ok: true, ttl: 300 OK","curl GET /api/v1/genesis/auth/sso-poll?state=test1234567890 → ready: true, payload.weise3_id OK"],"sso_tok_po_browseru":{"Chrome_Edge":"postMessage direktno → popup.close() → app.js prima GENESIS_AUTH_RESULT","Firefox_Safari":"postMessage preskočen (opener null) → SSO relay u Redis → poll svaki 800ms pokupi","Mobile_Android":"redirect na ?gl_return=1&session_token=...&weise3_id=... → app.js čita URL params"},"fajlovi_promijenjeni":["public/login/popup.html","api/auth.py"],"commit":"4f1620f","zakoni":["ZAKON 32 — svaki fix ima chain entry"]}}