Identity Admin API — реестр методов и общие правила области
Реестр admin-методов identity (контекст identity, сервис Pin.Identity.Api, area admin) и
общий дом правил этой области: модель актора администраторов платформы (m2m, ADR-0053), policy
AdminSystemOnly, обязательные заголовки, deep audit мутаций, соответствие permission-каталогу.
Область обслуживает администраторов платформы, которые живут в отдельной системе администрирования
и обращаются к identity через m2m-API — самих администраторов и их MFA identity не хранит (ADR-0053).
Документы методов ссылаются сюда и описывают только свою дельту; общий конверт ответа/ошибок — в
../README.md; дома полей — ../../domain/.
Metadata
| Поле | Значение |
|---|---|
| Сервис/контекст | identity |
| API area | admin (m2m, ADR-0053) |
| Тип документа | api (area-registry, не единичная операция) |
| Статус | draft |
| Owner | PIN Platform Core |
| Область действия | admin-операции над учётками (блокировка/удаление/сброс факторов/отзыв сессий); public- и internal-области — отдельные реестры (../README.md, ../internal/, ../company-user/) |
| Assumptions | система администрирования платформы (ADR-0053) — единственный клиент области; permission-каталог — ../../domain/permission.md, для неё каталог справочный |
Реестр методов
Route-префикс области — /api/admin/v1/. Все проверки — каталожное соответствие поверх policy
AdminSystemOnly (см. ниже).
| Метод | Route | Feature group | Permission (каталожное соответствие) | Документ |
|---|---|---|---|---|
| POST | /api/admin/v1/users/{userId}/block · /unblock | admin-users | identity.users.block + identity.users.view-all | block-user.md (unblock — симметричная дельта) |
| DELETE | /api/admin/v1/users/{userId} | admin-users | AdminSystemOnly (+AdminPrivilegedOnly для Purge) | delete-user.md (архив vs полное удаление) |
| POST | /api/admin/v1/users/{userId}/security/reset | admin-users | AdminSystemOnly (после ручной верификации) | reset-user-security.md |
| POST | /api/admin/v1/users/{userId}/sessions/revoke | admin-sessions | AdminSystemOnly (+ user-activity.sessions.* для витрины) | revoke-user-sessions.md |
Модель актора и доступ (общий дом)
Область обслуживает один класс актора — систему, не человека. Проверка доступа выполняется до бизнес-логики; её результат несёт контекст запроса.
| Проверка | Значение |
|---|---|
| Actor type | ExternalSystem — система администрирования платформы |
| Auth | OAuth2 client-credentials (m2m), клиент pin-admin-system — ADR-0053 |
| Auth policy | AdminSystemOnly: токен выдан клиенту pin-admin-system; иначе 403 |
| Privileged | AdminPrivilegedOnly для необратимых операций (Purge) — требует MFA/второго approve на стороне системы администрирования (граница admin-identity, ADR-0053) |
| Записи о вызывающем администраторе | identity знает систему; конкретного администратора несёт заголовок X-Admin-User-Id (actor-stamping) |
Обязательные заголовки области
| Заголовок | Где обязателен | Назначение |
|---|---|---|
X-Admin-User-Id | все методы | Guid администратора-инициатора внутри системы администрирования. Actor-stamping (UpdatedByUserId/DeletedByUserId) и subject deep audit: m2m-токен идентифицирует систему, заголовок — человека. Пустой/отсутствует → ValidationError/401. |
Idempotency-Key | мутации (все методы области — POST/DELETE) | Guid; клиент ретраит по таймауту. Повтор с тем же ключом → сохранённый результат (replay), шаги не повторяются. Ключ идемпотентности — admin:<operation>:{Idempotency-Key}. |
traceparent | все | OpenTelemetry trace для correlation. |
Deep audit admin-мутаций
Каждая мутация области попадает в deep audit — блокировки/удаления/сбросы факторов и отзыв сессий помечены как чувствительные:
- actor —
X-Admin-User-Id(+ m2m-клиентpin-admin-system); - объект —
UserEntity+UserId; - диф полей — before/after изменённых полей (значения секретов не логируются — только факт сброса);
- результат — success либо код ошибки.
Запись audit фиксируется в одном согласованном изменении вместе с мутацией агрегата, отзывом
RefreshSession и публикацией событий. Audit не tenanted (инвестор вне tenant; учётки менеджеров — по
CompanyId).
Интеграционные последствия и окно согласованности (общий дом)
Единые правила распространения эффектов admin-мутаций — что закладывать при интеграции:
- Эффекты асинхронны. Мутация в identity видна сразу после коммита; downstream (gateway,
crm/messenger/notifications/user-activity) применяет изменение по событиям
pin.identity.*с лагом в секунды. До применения потребитель может краткий промежуток видеть прежний snapshot. - Немедленная защита доступа. Вход и refresh блокируются немедленно (проверка
Status/отозванных сессий). Уже выданные access-JWT дорабатывают TTL (≤ 15 мин), но привилегированные операции gateway отклоняет раньше — по кэшу отозванныхsid(вытеснение ≤ 60 сек) и internal permission-check. - Кто побеждает при гонке. Мутации версионированы: конфликт с консюмером синка Talent или второй
admin-операцией даёт
CONCURRENCY_CONFLICT(409); система администрирования перечитывает актуальную версию и повторяет с тем жеIdempotency-Key(replay защищает от двойного эффекта). Для Talent- управляемых учёток PII-операции (Purge) уступают источнику — Talent Identity (см. delete-user). - Erasure-контракт. При анонимизации PII потребители обязаны перезаписать свои PII-реплики по
UserUpsertedKafkaEventс анонимизированным снапшотом; полнота перезаписи контролируется runbook.
Общий конверт и коды ошибок
- Успех — типизированная модель результата; дом моделей конверта — ../README.md.
- Ошибка —
RestApiErrorResponseс машиннымmessage-кодом иtraceId; enum сериализуются строкой.
| Код | HTTP | Условие | Retry |
|---|---|---|---|
ValidationError | 400 | Синтаксис/enum; пустой X-Admin-User-Id/Idempotency-Key | no retry |
UNAUTHORIZED | 401 | Нет/просрочен m2m client-credentials токен | no retry |
FORBIDDEN | 403 | Клиент не pin-admin-system либо нет privileged-подтверждения (Purge) | no retry |
IDENTITY_USER_NOT_FOUND | 404 | Целевой UserId не существует | no retry |
CONCURRENCY_CONFLICT | 409 | Гонка версий (Version) с консюмером синка или вторым админом | retry с тем же Idempotency-Key после перечитки |
Method-specific коды IDENTITY_* — в документах методов и разделе «Инварианты» дома
../../domain/user.md.
Связанные документы
- Дома полей: ../../domain/user.md (агрегат
UserEntity, INV-1..11, статусы), ../../domain/user-session.md (RefreshSession, INV-S7), ../../domain/permission.md (каталог). - События: ../../events/user-blocked.md, ../../events/user-upserted.md, ../../events/user-access-changed.md.
- Правила: api-method-template, command-query-template, algorithm-documentation-rules.
- Решения: ADR-0053 (система администрирования, m2m client-credentials, deep audit, архив vs purge), ADR-0052 (tenancy), ADR-0056 (simplicity-first).
- Соседние реестры: ../README.md (public/investor + общий конверт),
../internal/(m2m authorize),../company-user/(роли/пользователи компании).