Токени користувацької площини
Обміняйте логін-сесію на короткоживучий токен під цей сервіс — і як мапляться ролі.
Користувацька площина приймає рівно один вид токена: короткоживучий exchange-токен, викарбуваний identity provider-ом (auth.console) з audience provider-credentials-service. Логін/менеджмент-токен — навіть валідний — відхиляється: дисципліна audience — це один JWT, один цільовий сервіс.
Флоу
- Залогіньтеся в identity provider:
POST /v1/auth/login. Акаунти, що належать кільком організаціям, отримуютьstatus: org_selection_requiredі завершують черезPOST /v1/auth/select-org— обрана організація стаєorg_idтокена. - Обміняйте сесію на токен, скоуплений під сервіс:
POST /v1/auth/token/exchangeз{"audience": "provider-credentials-service"}. Результат — access-only JWT (ES256, живе хвилини, без refresh), що несеsub(UUID користувача),org_idі сирі організаційніroles. - Викликайте цей сервіс із
Authorization: Bearer <token>. Коли токен спливе — обміняйте знову: ваш якір оновлення — логін-сесія, а не цей сервіс.
import httpx
auth = httpx.post(f"{AUTH_BASE}/v1/auth/login", json={"email": EMAIL, "password": PASSWORD}).json()
# ... handle org selection / MFA states per the auth service's own docs ...
exchange = httpx.post(
f"{AUTH_BASE}/v1/auth/token/exchange",
headers={"Authorization": f"Bearer {auth['access_token']}"},
json={"audience": "provider-credentials-service"},
).json()
TOKEN = exchange["access_token"]
Identity provider публікує власну wiki для розробників із повною state-машиною логіну; ця сторінка покриває лише те, що цьому сервісу від нього потрібно.
Що мусить нести токен
iss/aud— сконфігурований issuer іprovider-credentials-service; будь-що інше —401.sub— користувач, канонічний UUID (неканонічні форми відхиляються).org_id— опційний; якщо присутній — канонічний UUID. Відсутній означає: без контексту організації — Organization Credentials відповідає403, а Credential Status звітуєnullдля рівня org.roles— сирі ролі організації (owner,admin,member,viewer).
Як мапляться ролі
Два незалежні мапінги читають той самий клейм roles:
- Сервісні ролі (
JWT_ROLE_MAP, за замовчуваннямowner→user, admin→user, member→user): дає роль §5.1, що ґейтить ендпоїнти.viewerне мапиться ні в що — такі токени отримують401. Підвищені ролі (provider_admin,auditor) за замовчуванням ніколи не виводяться з org-ролей; надати їх — свідоме рішення деплойменту. - Менеджери організації (
JWT_ORG_MANAGER_ROLES, за замовчуваннямowner,admin): перевіряються проти сирих ролей і ґейтять Organization Credentials — навмисно переживаючи сплющення з пункту вище.
Тож деплоймент за замовчуванням читається так: кожен учасник організації — це user; лише owner-и та admin-и керують credentials організації.
Dev-режим авторизації
Локальна розробка може обійти identity provider повністю: DEV_AUTH_ENABLED=true приймає заголовки X-Dev-User-Id, X-Dev-Roles, X-Dev-Org-Id, X-Dev-Org-Roles, застосовуючи ті самі правила UUID і ролей. Запити з заголовком Authorization завжди валідуються як JWT, незалежно ні від чого. У production-збірках відхиляється.