Поділіться org-credential
Менеджер зберігає один ключ на всю організацію; звичайному учаснику відмовлено, але статус він бачить.
Один вендорський ключ на всю команду: збережений один раз менеджером організації, відданий resolve-ом кожному учаснику, невидимий як запис для не-менеджерів.
Мета
Як менеджер організації — зберегти default-credential організації; як звичайний учасник — отримати 403 на інвентарі, але правдивий credential-status.
Дійові особи
| Актор | Сира роль в org | Може |
|---|---|---|
| Ольга | admin (менеджерська роль) |
читати й писати /v1/org-credentials |
| Марко | member |
ні те, ні інше — але credential-status працює |
Обидва токени мусять нести той самий org_id (User Plane Tokens).
Кроки
1. Ольга зберігає спільний ключ
Викличте POST /v1/org-credentials — та сама форма тіла, що й у персональному create; власник береться з org_id токена:
curl -s -X POST "$CREDS_BASE/v1/org-credentials" \
-H "Authorization: Bearer $OLHA_TOKEN" -H "Content-Type: application/json" \
-d '{
"provider_code": "'$CODE'",
"name": "Team key",
"credentials": {"api_key": "sk-org-0123456789abcdef"},
"make_default": true
}'
Очікуване 201: owner_type: "organization", owner_id = UUID організації, is_default: true, маска замість секрету.
2. Ольга бачить його в інвентарі організації
GET /v1/org-credentials → очікуване 200 із записом. Менеджер іншої організації побачив би порожній список — ізоляція за owner_id.
3. Маркові в інвентарі відмовлено
Той самий list-виклик із токеном Марка:
curl -s "$CREDS_BASE/v1/org-credentials" -H "Authorization: Bearer $MARKO_TOKEN"
Очікуване 403 FORBIDDEN — member не в менеджерському списку (JWT_ORG_MANAGER_ROLES). Читання ґейтяться точно так само, як записи: інвентар секретів організації — справа менеджерів.
4. Марко все одно дізнається те, що йому треба
Марко викликає credential-status для провайдера. Очікуване 200 з "organization_credentials_configured": true і — якщо в Марка немає персонального ключа — "effective_credential_source": "organization": його переклади працюватимуть на командному ключі, який він не може інспектувати.
Перевірено тестом test_s05_share_an_org_credential.