Перейти к основному содержимому

Статусные модели

Зачем нужно

Документ фиксирует статусы и допустимые переходы для сущностей identity. Реализация не должна вводить новые статусы без обновления этого документа.

auth_flow_session

Статусы

СтатусЗначение
startedflow создан, identifier ещё не подтверждён
identifier_resolvedпользователь найден или подготовлен к регистрации
password_requiredнужен пароль
otp_requiredнужен код
mfa_requiredнужен дополнительный фактор
profile_requiredнужны обязательные данные регистрации
completedflow завершён успешно
failedflow завершён ошибкой
expiredистёк expires_at

Переходы

ИзВУсловие
startedidentifier_resolvedidentifier валиден
identifier_resolvedpassword_requiredpassword step включён
identifier_resolvedotp_requiredOTP step включён
password_requiredmfa_requiredпароль верный, MFA обязателен
password_requiredcompletedпароль верный, дополнительных шагов нет
otp_requiredcompletedкод верный
mfa_requiredcompletedфактор подтверждён
любой активныйfailedпревышены attempts или security denial
любой активныйexpiredистёк TTL

verification_code

СтатусУсловие
activeсоздан, не истёк, не использован
consumedуспешно использован
expiredистёк срок
invalidatedзаменён новым кодом или заблокирован
lockedпревышены attempts

Переходы: active -> consumed, active -> expired, active -> invalidated, active -> locked. Обратных переходов нет.

user_session

СтатусУсловие
activerefresh token действителен
revokedпользователь или админ отозвал сессию
expiredистёк срок
compromisedобнаружено повторное использование rotated refresh token

При переходе в compromised отзывается вся refresh_token_family_id.

invitation

СтатусУсловие
pendingприглашение создано
acceptedпользователь принял
revokedотправитель или админ отозвал
expiredистёк срок

accepted, revoked, expired — финальные статусы.

organization

СтатусЗначение
draftсоздана, но ещё не подтверждена как рабочий контур
unclaimedорганизация существует, но owner не подтверждён
activeорганизация работает и имеет владельца
disputedесть спор за права или принадлежность
archivedбольше не используется
mergedсклеена с основной организацией

Переходы:

  • draft -> unclaimed;
  • draft -> active;
  • unclaimed -> active;
  • unclaimed -> disputed;
  • active -> disputed;
  • active -> archived;
  • disputed -> active;
  • disputed -> archived;
  • active -> merged;
  • archived -> active при разрешённом восстановлении.

Правила:

  • active требует owner_membership_id; из-за циклического создания organization + membership это проверяется на service layer или deferred constraint;
  • merged требует merged_into_organization_id;
  • merged нельзя физически удалять;
  • disputed меняет только системный администратор;
  • merge выполняет только системный администратор после impact preview.

События переходов:

  • identity.organization.created;
  • identity.organization.activated;
  • identity.organization.disputed;
  • identity.organization.archived;
  • identity.organization.restored;
  • identity.organization.marked_duplicate;
  • identity.organization.merged.

organization_membership

СтатусЗначение
requestedпользователь сам подал заявку
invitedпользователь приглашён
activeчленство активно
rejectedзаявка или invitation отклонены
suspendedчленство временно остановлено
leftпользователь вышел из организации

Переходы:

  • requested -> active;
  • requested -> rejected;
  • invited -> active;
  • invited -> rejected;
  • active -> suspended;
  • suspended -> active;
  • active -> left.

Правила:

  • active membership должен иметь role_id;
  • owner membership нельзя перевести в left или suspended, пока у organization нет нового owner;
  • членство в team возможно только для active/suspended organization membership, но write actions требуют active.

organization_ownership_claim

Переходы:

  • submitted -> needs_more_info;
  • submitted -> approved;
  • submitted -> rejected;
  • submitted -> disputed;
  • needs_more_info -> submitted;
  • needs_more_info -> approved;
  • needs_more_info -> rejected;
  • submitted -> cancelled.

Правила:

  • approved создаёт или активирует membership и назначает owner role;
  • approved обновляет organization.owner_membership_id;
  • disputed переводит организацию в disputed, если она ещё не disputed;
  • review выполняет только системный администратор.

organization_ownership_transfer

Переходы:

  • created -> sent;
  • sent -> accepted;
  • accepted -> completed;
  • sent -> expired;
  • created -> cancelled;
  • sent -> cancelled.

Правила:

  • from_membership_id должен быть текущим owner;
  • получатель должен быть active membership или принять приглашение;
  • completed меняет organization.owner_membership_id;
  • старый owner получает роль из old_owner_new_role_id;
  • expired/cancelled transfer не может быть completed.

organization_merge

Переходы:

  • planned -> confirmed;
  • confirmed -> completed;
  • planned -> cancelled;
  • confirmed -> failed.

Правила:

  • primary_organization_id <> duplicate_organization_id;
  • confirmed требует impact preview;
  • completed переводит duplicate organization в merged;
  • automatic merge запрещён;
  • операция доступна только системному администратору.

oauth_client

СтатусЗначение
activeclient может выполнять OAuth flow
disabledflow запрещён, tokens могут быть отозваны policy
deletedclient скрыт и не может использоваться

Переходы: active <-> disabled, active -> deleted, disabled -> deleted.

Platform-owned runtime capabilities

plugin, notification, platform settings, navigation, pages config, i18n and feature flags are not identity-owned state machines. They belong to the platform runtime capabilities layer by ADR-035. identity-api may temporarily host /api/v2/platform/* endpoints, but this file remains the canonical state-machine source only for identity-owned entities.

delegated_session

СтатусУсловие
activeended_at IS NULL и expires_at > now()
endedвзрослый завершил вручную
expiredистёк срок
revokedfamily link или access отозван

Правило: любая downstream-команда с delegated context должна проверять актуальность delegated session.

child_device_authorization

СтатусУсловие
createdзапрос создан на устройстве ребёнка, одноразовый код/QR token ещё действителен
approvedactive adult той же семьи подтвердил запрос
completedустройство ребёнка обменяло approval на user_session linked child user
expiredистёк TTL запроса
revokedadult или admin отозвал запрос

Переходы: created -> approved -> completed, created -> expired, created -> revoked, approved -> expired, approved -> revoked. completed, expired и revoked — финальные статусы.

Правило: child_device_authorization не создаёт delegated context взрослого. После completed создаётся обычная user_session ребёнка, если у student_profile есть linked_user_id.

user

СтатусЗначение
pendingаккаунт создан, нужны обязательные действия
activeпользователь может входить
blockedвход и refresh запрещены
deletedаккаунт anonymized/soft-deleted

blocked не удаляет данные и может быть снят администратором. deleted финален для пользовательского доступа.

Готовность

  • каждый transition проверяется сервером;
  • финальные статусы не возвращаются в активные без отдельной админской операции;
  • каждый security-relevant transition пишет audit;
  • фронтенд отображает все статусы без undefined-state.