Адмініструйте platform-credentials
Як названий оператор на сервісній площині: збережіть platform-fallback і перегляньте credentials усіх рівнів.
Місце оператора: Internal Admin API з admin-scoped токеном і міткою X-Admin-Actor, створення platform-рівневого ключа, на який усі провалюються.
Мета
Створити platform-default-credential, атрибутований названому оператору, а потім побачити credentials різних рівнів власності в одному списку.
Передумови
- Сервісний токен зі scope
provider-credentials.admin:export ADMIN_TOKEN=...(Service Plane Tokens).
Кроки
1. Прочитайте каталог зі схемами
Викличте GET /internal/v1/admin/providers. Очікуване 200: кожен провайдер із credential_schema inline — create-форма рендериться прямо з цього (Provider Schemas).
2. Створіть platform-credential — з явним власником
Викличте POST /internal/v1/admin/credentials. Адмін-площина називає власника в тілі; platform не бере owner_id:
curl -s -X POST "$CREDS_BASE/internal/v1/admin/credentials" \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "X-Admin-Actor: panel:olha" \
-H "Content-Type: application/json" \
-d '{
"provider_code": "'$CODE'",
"owner_type": "platform",
"name": "Shared fallback",
"credentials": {"api_key": "sk-platform-0123456789"},
"make_default": true
}'
Очікуване 201: owner_type: "platform", owner_id: null, is_default: true, маскований секрет. Невідповідні координати власника — platform з owner_id, або user/organization без нього — були б 400.
3. Один список — кожен рівень
Викличте GET /internal/v1/admin/credentials без фільтрів, потім звужено:
all_records = httpx.get(f"{CREDS_BASE}/internal/v1/admin/credentials",
headers=admin_headers).json()
platform_only = httpx.get(f"{CREDS_BASE}/internal/v1/admin/credentials",
params={"owner_type": "platform"}, headers=admin_headers).json()
Очікувано: нефільтрований список змішує записи user, organization і platform (лише маски); owner_type=platform звужує до fallback-ключів.
4. Атрибуція справжня
Create з кроку 2 ліг в audit-стрічку з actor_id = "service:<client_id>!panel:olha" — відфільтруйте його в сценарії 09. Анонімний виклик (без X-Admin-Actor) тут би спрацював — на відміну від reveal — але панель завжди надсилає мітку: бюджети на кожного оператора й читабельна стрічка варті одного заголовка.
Перевірено тестом test_s07_administer_platform_credentials.