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) { // Der haeufigste Irrtum an dieser Stelle: Es wurde der Shared Key // geschickt. Der ist kein Token - er hat weder Bindung noch Rechteliste, // und die Frage "wer bin ich" hat fuer ihn keine Antwort. Ohne diesen // Hinweis sucht der Aufrufer den Fehler bei seinem Token. $sharedKey = (string)Config::get('security.shared_key', ''); if ($sharedKey !== '' && hash_equals($sharedKey, $presented)) { Http::fail( 401, 'not_a_token', 'Das ist der Shared Key, kein Agenten-Token. Er hat keine Bindung und keine ' . 'Rechteliste - dieser Endpunkt kann darueber nichts sagen.' ); } 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, ]);