oder X-Agent-Token.'); } $db = Db::init(); $manager = new TokenManager($db); // Ohne geforderten Scope: die Frage lautet "wer bin ich", nicht "darf ich // etwas". Widerruf, kaskadierender Widerruf und Ablauf werden trotzdem // geprueft - ein entwertetes Token bekommt hier keine Auskunft. $token = $manager->validateToken($presented, null); if ($token === null) { Http::fail(401, 'invalid_token', 'Token unbekannt, widerrufen oder abgelaufen.'); } $scopes = TokenManager::decodeScopes($token['scopes']); $isWorkbench = ($token['owner_type'] ?? null) === 'dev_agent'; Http::ok([ 'token_id' => (string)$token['token_id'], 'name' => (string)$token['name'], 'type' => (string)$token['type'], 'owner_type' => (string)$token['owner_type'], 'owner_identity' => $token['owner_identity'] !== null ? (string)$token['owner_identity'] : null, // Werkbank-Token duerfen in fremde Projekte melden, Laufzeit-Token nicht. // Der Unterschied entscheidet ueber Fremdmeldungen und ist deshalb der // erste Wert, den ein Werkzeug pruefen sollte. 'is_workbench' => $isWorkbench, 'project_slug' => $token['project_slug'] !== null ? (string)$token['project_slug'] : null, 'environment' => (string)$token['environment'], 'scopes' => $scopes, 'created_at' => $token['created_at'] !== null ? (string)$token['created_at'] : null, 'last_used_at' => $token['last_used_at'] !== null ? (string)$token['last_used_at'] : null, 'expires_at' => $token['expires_at'] !== null ? (string)$token['expires_at'] : null, 'parent_token_id' => $token['parent_token_id'] !== null ? (string)$token['parent_token_id'] : null, ]);