diff --git a/public/api/_bootstrap.php b/public/api/_bootstrap.php index 69db46db..92bdd56a 100644 --- a/public/api/_bootstrap.php +++ b/public/api/_bootstrap.php @@ -1,30 +1,59 @@ -createToken($request->device_name)->plainTextToken — è Sanctum puro. Ecco perché il token ha il formato 4|.... +app/User.php usa Laravel\Sanctum\HasApiTokens — il modello utente è predisposto per Sanctum. -ini_set('display_errors', 1); -error_reporting(E_ALL); +Quindi il login genera token Sanctum, ma il _bootstrap.php (ereditato dal multiscuola) li valida col vecchio TokenGuard che cerca api_token. Disallineamento totale. Sistemiamo il bootstrap perché usi Sanctum. -header('Content-Type: application/json'); +Il _bootstrap.php corretto -// ============================== -// DB (public/class/db-functions.php) -// ============================== -require_once dirname(__DIR__) . '/class/db-functions.php'; -$db = DBHandlerSelect::getInstance()->getConnection(); +Sostituisco il blocco AUTH. Copia-incolla questo intero comando in SSH per riscrivere il file con la validazione Sanctum giusta: -// ============================== -// AUTH VANGUARD (radice progetto: extra/auth.php) -// ============================== -require_once dirname(__DIR__, 2) . '/extra/auth.php'; +bash +cat > public/api/_bootstrap.php << 'EOF' + user(); + declare(strict_types=1); -if (!$user) { - http_response_code(401); - echo json_encode(['error' => 'Unauthorized']); - exit; -} + ini_set('display_errors', 1); + error_reporting(E_ALL); + + header('Content-Type: application/json'); + + // ============================== + // DB (public/class/db-functions.php) + // ============================== + require_once dirname(__DIR__) . '/class/db-functions.php'; + $db = DBHandlerSelect::getInstance()->getConnection(); + + // ============================== + // BOOTSTRAP LARAVEL (per Sanctum + Eloquent) + // ============================== + require_once dirname(__DIR__, 2) . '/vendor/autoload.php'; + $app = require_once dirname(__DIR__, 2) . '/bootstrap/app.php'; + $app->make(\Illuminate\Contracts\Http\Kernel::class) + ->bootstrap(); + + // ============================== + // AUTH SANCTUM (TOKEN Bearer) + // ============================== + $authHeader = $_SERVER['HTTP_AUTHORIZATION'] + ?? $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] + ?? ''; + + if (!preg_match('/Bearer\s+(.*)$/i', $authHeader, $m)) { + http_response_code(401); + echo json_encode(['error' => 'Unauthorized', 'reason' => 'no bearer']); + exit; + } + + $bearer = trim($m[1]); + $accessToken = \Laravel\Sanctum\PersonalAccessToken::findToken($bearer); + $user = $accessToken?->tokenable; + + if (!$user) { + http_response_code(401); + echo json_encode(['error' => 'Unauthorized', 'reason' => 'invalid token']); + exit; + }