Массовое удаление Authorization tokens Claude Code

Если в организации Claude Code накопились десятки OAuth-токенов (старые сессии, чужие машины, забытые интеграции), их проще отозвать пачкой из DevTools, будучи залогиненным в аккаунт Anthropic/Claude.

Скрипт ниже: список токенов application_slug=claude-code → confirm → POST revoke с паузой 200 мс. Запускайте только в своём браузере и только для своей организации.

Как запустить

  1. Откройте кабинет Anthropic / Claude под нужным аккаунтом.
  2. В Network найдите запрос вида /api/oauth/organizations/<ORG_ID>/oauth_tokens?application_slug=claude-code и скопируйте ORG_ID.
  3. Откройте консоль DevTools на том же домене, вставьте скрипт, подставьте ORG_ID, выполните.
  4. Подтвердите диалог — будут отозваны все неистёкшие токены Claude Code в этой org.

Скрипт

(async () => {
    const ORG_ID = 'YOUR_ORG_ID';

    const listUrl =
        /api/oauth/organizations/${ORG_ID}/oauth_tokens?application_slug=claude-code;

    const response = await fetch(listUrl, { credentials: 'include' });
    if (!response.ok) {
        throw new Error(Не удалось получить токены: HTTP ${response.status});
    }

    const data = await response.json();
    const tokens = data.filter(token => !token.is_revoked);

    console.log(Найдено активных токенов: ${tokens.length});

    if (!confirm(
        Будут отозваны ВСЕ ${tokens.length} активных токенов Claude Code.\n\n +
        После этого Claude Code и сторонние сервисы потеряют доступ.\n\n +
        Продолжить?
    )) {
        console.log('Отменено.');
        return;
    }

    let success = 0;
    let failed = 0;

    for (let i = 0; i < tokens.length; i++) {
        const token = tokens[i];
        try {
            const revokeUrl =
                /api/oauth/organizations/${ORG_ID}/oauth_tokens/${token.id}/revoke;
            const res = await fetch(revokeUrl, {
                method: 'POST',
                credentials: 'include',
            });
            if (res.ok) {
                success++;
                console.log([${i + 1}/${tokens.length}] OK);
            } else {
                failed++;
                console.error([${i + 1}/${tokens.length}] ERROR ${res.status});
            }
        } catch (error) {
            failed++;
            console.error([${i + 1}/${tokens.length}] ERROR, error);
        }
        await new Promise(resolve => setTimeout(resolve, 200));
    }

    console.log(Готово. Отозвано: ${success}, ошибок: ${failed});
})();

На что смотреть

  • Нужна сессия в браузере с правами на org — без cookies запросы вернут 401/403.
  • После revoke перелогиньте Claude Code / обновите токены интеграций.
  • Не оставляйте ORG_ID в скриптах репозитория и не гоняйте это «вслепую» на чужой org.