diff --git a/application/controllers/AuthController.php b/application/controllers/AuthController.php index c1bb74f..2bf5653 100644 --- a/application/controllers/AuthController.php +++ b/application/controllers/AuthController.php @@ -91,9 +91,25 @@ class AuthController extends BaseController 'is_active' => 1, ]); - // Genera tokens - $accessToken = $this->generateJWT($userId); - $refreshToken = $this->generateRefreshToken($userId); + // --- Sessione tracciata (jti) come nel login: requireAuth rifiuta i token + // senza jti, quindi senza questo l'utente appena registrato verrebbe + // sbattuto fuori al primo getMe/completeOnboarding (401 JWT_NO_JTI). --- + $jti = bin2hex(random_bytes(16)); + $ua = $_SERVER['HTTP_USER_AGENT'] ?? ''; + $ip = $this->getClientIP(); + Database::insert('active_sessions', [ + 'id' => $jti, + 'user_id' => (int) $userId, + 'organization_id' => null, + 'ip_address' => $ip, + 'user_agent' => substr($ua, 0, 512), + 'device_label' => $this->parseDeviceLabel($ua), + 'expires_at' => date('Y-m-d H:i:s', time() + JWT_REFRESH_EXPIRES_IN), + ]); + + // Genera tokens (con jti, come login) + $accessToken = $this->generateJWT($userId, ['jti' => $jti]); + $refreshToken = $this->generateRefreshToken($userId, $jti); // Audit log $this->currentUser = ['id' => $userId]; diff --git a/public/index.php b/public/index.php index 23432a8..519b141 100644 --- a/public/index.php +++ b/public/index.php @@ -557,6 +557,10 @@ if (is_numeric($actionName)) { // /controller/action/subAction → nome composto (es: evidence/upload) $camelResource = $toCamel($resourceId); $candidates[] = ['p' => "{$method}:{$actionName}/{$camelResource}", 'a' => []]; + // Fallback: id NON numerico (es. jti esadecimale di una sessione, + // token) passato come STRINGA → match su {method}:{action}/{id}. + // Necessario per DELETE /auth/sessions/ (revoca sessione singola). + $candidates[] = ['p' => "{$method}:{$actionName}/{id}", 'a' => [$resourceId]]; } } diff --git a/public/version.json b/public/version.json index 0c1f26a..d5bc29d 100644 --- a/public/version.json +++ b/public/version.json @@ -1 +1 @@ -{"version":"1.10.3","build":"2026-05-31-v1.10.3","date":"2026-05-31","changelog":"Fix da test multi-agente: dashboard gauge compliance (fallback overall_score quando 0 controlli, ora il backend ritorna score), risks.html backToList ripristina la vista corretta tra le 4 viste (table/matrix/fair/kri) e loadFair legge data.items. Selettore modali categorie/template corretto."} +{"version":"1.10.4","build":"2026-05-31-v1.10.4","date":"2026-05-31","changelog":"Fix auth da test multi-agente: registrazione ora crea sessione tracciata (jti) come il login (prima l'utente registrato veniva sbattuto fuori al primo accesso, 401 JWT_NO_JTI); revoca sessione singola (Disconnetti dispositivo) ora funziona con jti esadecimale (routing {id} stringa). Dashboard gauge, risks viste e modali fornitori gia' corretti."}