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

Переход на вход через identity

Актуально для: identity после 0.36, координатор с настройкой platform_token · Проверено: 01.10.2026

Это регламент для оператора установки. Решение описано в ADR-0047 §8a: токены, которые принимают все сервисы SimpleTwo, выпускает identity. Сегодня сессию человеку выдаёт координатор (токен HMAC на общем секрете ST_TOKEN_SECRET); после переключения координатор из пути входа уходит и остаётся хозяином парка и ролей (RBAC).

Переключатель один — настройка координатора platform_token, значения hmac (по умолчанию) и identity. Пока он в hmac, ничего из описанного ниже не действует.

Перед переключением

Переключатель сам проверяет пять условий и не включится, пока они не выполнены. Остальные условия — выпуск приложений со входом через identity, учётные данные служебных ботов, передача заданий каталога, решение о назначениях — в списке проверок ниже: пройдите его целиком.

1. Что меняется​

Для людей. Вход — только на странице identity, в системном браузере: Safari-окно (ASWebAuthenticationSession) на iOS и macOS, Custom Tabs на Android, обычная вкладка для веб-клиента. Приложение пароль больше не видит. Пароль, второй фактор, ключ доступа, подтверждение на телефоне, коды по почте, сброс пароля — всё на одной странице identity. Если организация входит через свой ADFS, Entra или Keycloak, страница identity переадресует туда. В момент переключения каждый войдёт заново один раз: приложение скажет «войдите снова» и откроет страницу identity. Дальше вход держится так же, как сегодня: токен живёт 12 часов и продлевается у identity, а если identity недоступна, уже вошедший продолжает работать, пока сервис не перестал слышать ленту отзыва: если сервис не читал её дольше предела (10 минут по умолчанию, Settings → «Вход через identity»), он отклоняет токены, выписанные раньше этого предела, — такой токен мог быть отозван незаметно для сервиса. Токен, выписанный после, проходит.

Выход из системы, «Это был не я», сброс пароля, «выйти везде» и блокировка учётной записи теперь действуют во всех сервисах сразу: у человека одна сессия, и её конец за 30 секунд доходит до чата, календаря, почты и консоли.

Для администраторов.

  • В консоль координатора (/admin) входят через identity. Локальный вход консоли, карточка SSO и локальные пароли пользователей координатора уходят. Единственный локальный вход, который остаётся, — учётная запись экстренного доступа (break-glass) по адресу /admin/breakglass.
  • Люди, группы, членство, политика входа, домены входа, корпоративные провайдеры, гости, боты, LDAP и HRMS ведутся в консоли identity (identity_url/admin). В консоли координатора остаются парк, роли и привязка «группа → роли».
  • Роли по-прежнему назначаются в консоли координатора и действуют сразу: в токене ролей нет, каждый сервис спрашивает координатора, что человеку можно, и обновляет ответ каждые 15 секунд.

Для гостей. Гость — учётная запись identity с ответственным (пригласившим сотрудником). Приглашение, продление, отзыв и код восстановления в приложении работают как прежде, но выполняет их identity. Гость входит на странице identity, как все. Ссылка-приглашение на встречу или в чат — не учётная запись и не меняется.

Для ботов и интеграций.

  • Рабочий бот (бот поддержки, рассылки, интеграции) получает токен у identity по client_credentials, client_id = bot:[имя бота], с ключом (private_key_jwt) или секретом. Непрозрачный токен bot_… от messaging в режиме identity отклоняется.
  • Ассистент, чей мозг работает на устройстве владельца, получает токен обменом токена владельца (RFC 8693); ничего делать не нужно — это делает обновлённое приложение владельца.
  • У каждого бота есть владелец. Владелец отключён или удалён — его боты и ассистенты отключаются вместе с ним (кроме системных ботов организации: их консоль помечает).
  • Протокольные входы (SMTP, JMAP, CalDAV, CardDAV, WebDAV, LDAP) — по паролям приложений identity. Пароли CalDAV календаря и токен сессии вместо пароля в CardDAV уходят.
  • Сторонние приложения, которые уже входят через identity по OIDC, SAML или LDAP, ничего не замечают.

2. Проверки перед переключением​

Переключатель сам отказывает (409 со списком), пока не выполнены первые пять пунктов и часть пункта 7, касающаяся ботов самой платформы. Остальное он не проверяет — это проверяет оператор.

Ниже $S2 — публичный адрес координатора (https://s2.example.com), $ID — публичный адрес identity (https://id.example.com), $ADMIN_TOKEN — токен консоли координатора с правом settings:read/settings:write, $ID_TOKEN — токен консоли identity администратора identity.

Консоль координатора → Settings → карточка «Вход через identity» показывает оба переключателя (platform_token и service_token) и всё, что мешает каждому, со ссылкой туда, где это исправляется; третьим — переключатель CalDAV и CardDAV (dav_auth). То же одним запросом — он показывает все проверки переключателя сразу:

curl -fsS "$S2/admin/api/settings/platform-token" -H "Authorization: Bearer $ADMIN_TOKEN" | jq

Ответ: mode, issuer, identity_issuer_on, pinned_keys, pinned_at, door, blockers (пустой список — можно переключать), error, remaining.

#УсловиеКак проверить
1identity развёрнута и отвечает по публичному имениКонсоль координатора → Settings → карточка Identity: имя, способ доступа (direct/nat), во что разрешается, «announced». curl -fsS "$ID/healthz" с обычной проверкой TLS. Документ обнаружения curl -fsS "$S2/.well-known/simpletwo.json" содержит identity_url. Блокер: identity is not deployed with a public name.
2У identity включён выпуск токена платформы (platform_issuer: on)curl -fsS "$ID/control/platform-issuer" -H "Authorization: Bearer $ID_TOKEN" → {"mode":"on"}. Включить: тот же адрес, PUT с {"mode":"on"} (аудит platform_issuer.set). В $ID/healthz — platform_issuer.mode: on. То же в консоли identity → Политики → «Выпуск токена платформы». Блокер: identity's platform issuer is off.
3Ключи identity закреплены в желаемом состоянииpinned_keys ≥ 1 и свежий pinned_at (координатор забирает JWKS раз в 5 минут). Блокер: identity's keys are not pinned yet.
4Задан публичный адрес координатораSettings → публичный адрес. Без него сервисы не дотянутся до проекции RBAC. Блокер: no public URL: ….
5Учётная запись экстренного доступа заведена и проверенаSettings → «Break-glass account»: состояние «active». Заводит владелец (пароль от 12 символов + TOTP; замена ждёт первого кода). Проверить вход: открыть $S2/admin/breakglass, войти паролем и кодом, убедиться, что консоль открылась, выйти. В журнале аудита — breakglass.signin, у владельцев и администраторов — сообщение от бота поддержки. Пароль и генератор кодов хранить там, куда дежурный дотянется без платформы. Блокер: no break-glass credential is enrolled.
6Установлены клиенты, которые входят через identity — iOS, macOS, Android, вебВыпуск приложений с входом через системный браузер (п. 7) и выпуск координатора со страницей входа веб-клиента и консоли. Доля обновившихся: консоль координатора, список устройств — платформа и версия приложения у каждого устройства (см. Клиенты, «Наблюдение за парком»). Кто не обновился, после переключения не войдёт, пока не обновится.
7У рабочих ботов есть учётные данные identityКонсоль identity → «Боты»: у каждого бота есть активный владелец и ключ или секрет; у бесхозных — передать владельца. Сам бот уже берёт токен у identity: POST $ID/oauth/token с grant_type=client_credentials отвечает токеном (до переключения его не принимает ни один сервис — это нормально). Боты самой платформы переводятся сами, это проверяет переключатель: входит только бот поддержки каждого случая поддержки (бот приветствия пишет через автоматизации messaging, карточки календаря пишет ассистент по служебному токену календаря, MCU ходит со своим ключом моста — им учётные данные не нужны). Агент на хосте поддержки, как только развёрнута identity, сам создаёт ключ бота (/var/lib/simpletwo/bot-key, закрытая часть хост не покидает), координатор регистрирует открытую часть в identity, и с переключением бот берёт токен у identity по client_credentials. Владелец такого бота — администратор, который провёл настройку поддержки; бот системный и при уходе владельца не отключается, консоль identity предлагает передать владельца. Проверка: у бота поддержки в консоли identity → «Боты» есть ключ; в желаемом состоянии хоста поддержки есть bot_key_kid. Если нет — в отчётах узла поддержки ошибка platform bot key: …. Блокер: platform bots without identity credentials: … со списком ботов и случаев поддержки.
8Задания каталога переданы на identityКонсоль координатора → Settings: карточки LDAP, «Directory photos (AD / LDAP)» и «SimpleOne (HRMS)» говорят «managed on identity» со ссылкой. В консоли identity → «Каталог» видны подключение, отметки и последние результаты проходов групп, людей и фотографий. Если карточка говорит, почему передачи не было (identity нет или она старше двери передачи), — сначала обновить identity и messaging, потом координатор.
9Решение по назначению доступа (provisioning)Консоль identity → Политики → «Доступ к SimpleTwo». Для действующей установки при переключении безопаснее одно из двух: оставить выключенным (все во всех сервисах, как сегодня) или включить с флажком «Всем — сообщения и календарь». Включать «только по назначению» без флажка — значит отозвать чат и календарь у всех, кому ничего не назначено. Подробно: Доступ к SimpleTwo.
10Домены входа и корпоративный провайдер настроены в identityКонсоль identity → домены входа: у каждого домена, с которым люди входят, правильный владелец — identity или провайдер. Провайдер (ADFS, Entra, Keycloak, SAML) заведён в identity и проверен входом тестовой учётной записи на $ID. Карточка SSO координатора после переключения не работает. См. Домены входа, ADFS, SAML.
11Пара узлов identity, если установке она нужнаПосле переключения identity на критическом пути: без неё никто не войдёт заново (вошедшие работают до 12 часов). Для установки, которой это неприемлемо, — второй узел и реплицируемая база до переключения. На 30.09.2026 не сделано: вопрос ниже.
12Служебные токены на ключах (service_token: keys, п. 4)На 30.09.2026 не вышло. До выхода служебные токены сервисов подписываются общим секретом, и ST_TOKEN_SECRET после переключения удалить нельзя.

Дополнительно, перед окном:

  • все сервисы (messaging, calendar, mail, identity) на выпусках с новой дверью: в /healthz каждого есть поле platform_token со значением mode: hmac;
  • учётные записи, которых нет в identity: консоль координатора → Identity → расхождение («accounts here with no home on identity»), при необходимости — «write missing accounts». Учётная запись без записи в identity после переключения не войдёт.

3. Переключение​

Порядок​

  1. Объявить окно: людям — «в [время] приложение попросит войти заново», дежурному — канал связи вне платформы.

  2. Пройти список раздела 2; blockers пуст.

  3. Держать открытой вторую сессию консоли — экстренный вход в отдельном окне ($S2/admin/breakglass), на случай если вход через identity не заработает.

  4. Переключить: в консоли — карточка «Вход через identity» → «Перейти на identity…», затем ввести слово identity; или запросом:

    curl -fsS -X PUT "$S2/admin/api/settings/platform-token" \
    -H "Authorization: Bearer $ADMIN_TOKEN" -H 'Content-Type: application/json' \
    -d '{"mode":"identity"}' | jq

    Ответ — то же представление, что у GET, с mode: identity и door: identity. Перед сохранением координатор заново забирает ключи и спрашивает identity, включён ли выпуск, — прошлым проверкам он не доверяет. Если что-то не так — 409 с {"error": "the platform token cannot be switched to identity yet", "blockers": [...]}, ничего не меняется:

    БлокерЧто сделать
    identity is not deployed with a public nameп. 1 — DNS, сертификат, «announced» на карточке Identity
    identity's platform issuer is off (Identity → platform-issuer)п. 2 — PUT /control/platform-issuer {"mode":"on"}
    identity's keys are not pinned yetп. 3 — подождать до 5 минут или смотреть error в ответе
    no public URL: the services cannot reach the RBAC projectionп. 4
    no break-glass credential is enrolledп. 5

    В аудите координатора — platform_token.set со значением identity.

Что происходит в этот момент​

  • Координатор переключается сразу, по своей настройке. Его двери (приложения, консоль) принимают только токен identity; каталог по CardDAV — пароль приложения identity с областью carddav вместо токена сессии. Вход паролем (/v1/auth/login), обновление (/v1/auth/refresh), возврат SSO и локальный вход консоли отвечают «люди входят через identity». Сессия HMAC человека отклоняется с кодом sign_in_through_identity.
  • messaging, calendar, mail, identity получают новое желаемое состояние (ST_PLATFORM_TOKEN=identity, адрес выпускающего, закреплённые ключи, адреса ленты отзыва и RBAC), перерисовывают окружение и перезапускаются. Агент опрашивает координатора раз в минуту — 1–2 минуты на хостах работает старый режим, пока не перезапустятся. Сервис в режиме identity, которому не хватает выпускающего, ключей, ленты или RBAC, не стартует — это видно в «Servers & deploys».
  • Документ обнаружения объявляет platform_token: identity, platform_issuer и platform_client_id: "simpletwo". Приложения по нему переходят на вход через браузер.
  • Каждый сервис начинает читать ленту отзыва identity каждые 30 секунд и проекцию RBAC координатора каждые 15 секунд. Пока RBAC не прочитан ни разу, сервис отказывает во всём, что требует права.

Остаются на старом пути до п. 4 и п. 8: служебные токены сервисов, помещения, сессия бота у координатора, чат-доступ гостя встречи по ссылке. Гость, чей токен выписан до появления в нём признака knd, войдёт заново.

Что увидят люди​

  • Одно сообщение «войдите снова» в каждом приложении при первом запросе после переключения. Приложение не повторяет запрос в цикле: код sign_in_through_identity означает «войти один раз». Вход — на странице identity; для организации с корпоративным провайдером — переадресация к нему.
  • Кто не обновил приложение, увидит ошибку входа: старое приложение не умеет входить через браузер. Ответ — обновить.
  • Звонок, начатый до переключения, может оборваться при переподключении, когда его сервис перезапустится.

Первый час​

Смотреть каждые несколько минут:

  • /healthz каждого сервиса (координатор, messaging, calendar, mail, identity) — поле platform_token:
    • mode: identity, issuer — ровно публичный адрес identity;
    • revocations.cursor растёт или стоит, revocations.last_ok — не старше минуты, revocations.error пуст, revocations.stale: false (stale_after — предел, по умолчанию 10m0s; при stale: true сервис отклоняет токены старше предела);
    • rbac.loaded: true, rbac.last_ok — не старше 30 секунд, rbac.error пуст;
    • у координатора door: unavailable вместо набора полей — он не может проверять токен identity; смотреть error в GET /admin/api/settings/platform-token.
  • identity /healthz — platform_issuer: {mode: on, feed_head}; feed_head — голова ленты отзыва, курсоры сервисов должны её догонять.
  • Аудит identity — поток platform.token (выпуск токена платформы, по одному на вход и обновление) растёт по мере того, как люди входят; входы и отказы — в журнале входов (Последние входы).
  • Аудит координатора — platform_token.set; любой breakglass.signin — это сигнал, что кто-то не смог войти через identity.
  • Доля вошедших: список устройств координатора и журнал входов identity; к концу часа большинство активных устройств должно войти.
  • Ошибки у сервисов: всплеск 401 на messaging и calendar в первые минуты — ожидаемые «войдите снова»; 403 на действиях, требующих прав, — признак того, что RBAC не читается.

Проверить сценарием, а не одним /healthz: вход на iOS, Android, macOS и в веб-клиенте; сообщение на второе устройство; событие календаря; письмо через JMAP; вход в консоль координатора через identity; «выйти везде» у тестовой учётной записи — через 30 секунд отказывают все её устройства.

4. Откат​

Возврат всегда разрешён и ничего не проверяет:

curl -fsS -X PUT "$S2/admin/api/settings/platform-token" \
-H "Authorization: Bearer $ADMIN_TOKEN" -H 'Content-Type: application/json' \
-d '{"mode":"hmac"}'

Если консоль через identity не открывается — войти экстренной учётной записью ($S2/admin/breakglass): её сессия открывает консоль в обоих режимах.

Что сохраняется. Всё, что хранит identity: учётные записи, группы, сессии identity, журнал отзыва (он пишется в обоих режимах), назначения доступа, гости и боты identity, переданные задания каталога. Сессии и токены обновления координатора не удалялись — удаляются только после стабильного периода (раздел 5).

Что увидят люди. Ещё раз «войдите снова»: документ обнаружения снова говорит hmac, приложения возвращаются к прежнему входу, а токен identity сервисы в режиме hmac не принимают. Сессия, сброшенная приложением при переключении, не вернётся — войти придётся заново.

Где откат не полный (проверить до переключения, см. вопросы ниже):

  • бот, пересозданный с credential: platform, лишился непрозрачного токена — в hmac он не войдёт, пока ему не выпустят новый токен в консоли координатора;
  • гость, приглашённый через identity в режиме identity, — у координатора есть его проекция, но пароля для старого входа может не быть;
  • после удалений раздела 5 отката нет.

5. После стабильного периода​

Удаления из ADR-0047 §8a, каждое — отдельный выпуск. Их порядок: сначала то, от чего никто не зависит, последним — общий секрет.

  • Токен сессии HMAC человека: выдача и проверка у координатора, messaging, calendar, mail, identity; двери продления /v1/auth/renew для людей.
  • Токены обновления координатора (/v1/auth/refresh, их таблица).
  • Пути входа через координатора: /v1/auth/login, /v1/auth/passkey/*, возврат SSO, локальный вход консоли /admin/api/login, карточка SSO, локальные пароли пользователей. Остаётся /admin/breakglass.
  • Копия заданий каталога у координатора (решение владельца 30.09.2026: уходит с переключением): ldapphoto, ldapgroups.go, ldappeople.go, avatarsync.go, hrms.go, integration.go, их карточки, настройки и запасной путь передачи. Единственный читатель LDAP — ldapdir identity.
  • Непрозрачные токены ботов bot_… в messaging (после того, как все боты берут токен у identity; пересоздание с credential: platform удаляет мёртвый хэш).
  • Пароли CalDAV календаря и токен сессии вместо пароля в CardDAV — после перехода на пароли приложений identity. С 01.10.2026: CardDAV координатора в этом режиме уже берёт пароль приложения (carddav); пароли устройств календаря уходят отдельным переключателем dav_auth (карточка «Вход через identity» → CalDAV и CardDAV, или PUT /admin/api/settings/dav-auth), когда люди завели пароли приложений.
  • ST_TOKEN_SECRET — только после служебных токенов на ключах (п. 4): до тех пор им подписываются токены сервисов.
  • Журнал отзыва остаётся; уходят пулл координатора каждые 15 секунд и рассылка отзыва HMAC-сессий.

6. Где что было и где стало​

ЧтоБылоСтало
Люди (учётные записи, блокировка, удаление, пароли)координатор → Usersidentity → Люди. В Users координатора — роли человека и его устройства
Группы и членствокоординатор → Users → Groupsidentity → Группы. У координатора — только «Groups → roles»
Роли и правакоординатор → Users → Rolesбез изменений, координатор
Вход через корпоративный провайдеркоординатор → Users → карточка «Single sign-on (OIDC)»identity → корпоративные провайдеры и домены входа
Локальный вход консоли/admin, логин и пароль/admin → страница identity; экстренно — /admin/breakglass
Гости: приглашение, срок, отзыв, коды восстановлениякоординатор → Users (фильтр guest), «Access recovery», guest-max-daysidentity → «Гости» и политика гостей (max_days, default_days, max_per_sponsor); в приложении — как было
Боты: созданиекоординатор → AI & automation → Botsпока там же (запись пишется в identity и messaging)
Боты: владелец, ключи, секреты, передача, ревизиянетidentity → «Боты», политика ревизий bot_days
Подключение LDAP, группы и люди из LDAPкоординатор → Settings → LDAPidentity → «Каталог»
Фотографии из AD/LDAPкоординатор → Settings → «Directory photos (AD / LDAP)»identity → «Каталог»; политика фото прежняя
SimpleOne (HRMS)координатор → Settings → «SimpleOne (HRMS)»identity → «Каталог»
Пропуск пароля в LDAPкоординатор → LDAPidentity, PUT /control/ldap/pass-through (с 28.09)
Доступ к сервисамнетidentity → Политики / Люди / Группы → «Доступ к SimpleTwo»
Переключатель токенанеткоординатор → Settings → «Вход через identity» (GET/PUT /admin/api/settings/platform-token, /service-token); выпуск у identity — консоль identity → Политики → «Выпуск токена платформы»

7. Режим каталога — опция продукта ID​

С identity 0.46 у роли два режима. Провайдер (по умолчанию) — всё, что описано выше: собственные учётные данные и факторы, провайдер OIDC/SAML для приложений компании, LDAP-сервер, выпуск токена платформы. Каталог — identity ведёт только людей, группы, алиасы, контакты, ящики и provisioning, принимает SCIM, брокерит вход к корпоративному провайдеру; вход людей выдаёт координатор, как до переключения. В режиме каталога двери провайдера отвечают 409 provider_off, страница входа предлагает только кнопки корпоративного провайдера, LDAP-слушатели не открываются, а переключатели политики, которые включили бы фактор или провайдер, отклоняются с тем же кодом. Двери координатора (хранение и проверка паролей, кодов гостей, паролей приложений) открыты в обоих режимах: координатор — аутентификатор ядра и хранит в каталоге то, чем сам проверяет вход.

Режим задаёт консоль координатора: Настройки → Опции продукта → ID. Выключенная опция доходит до хоста identity с его желаемым состоянием (параметр mode, переменная DIR_MODE) на следующем опросе. Опцию нельзя выключить, пока platform_token стоит на identity: сначала назад на hmac. Консоль identity показывает режим каталога карточкой на вкладке «Политики»; /healthz отдаёт mode.

Открытые вопросы​

То, что ADR-0047 не решает, а оператор встретит:

  1. Кто объявляет окно и как. Не определено, кто сообщает людям о повторном входе и по какому каналу — сам SimpleTwo (бот, баннер в приложении) или организация.
  2. Сколько ждать обновления клиентов. Нет порога доли обновившихся устройств и срока между выпуском клиентов и переключением; нет и способа заставить старое приложение обновиться, кроме сообщения «войдите снова».
  3. Кнопки нет — сведено 01.10.2026: карточка «Вход через identity» в Settings координатора (оба переключателя, блокеры со ссылками, переключение в два шага с вводом слова, возврат) и «Выпуск токена платформы» в политиках консоли identity.
  4. Гости в момент переключения — сведено 30.09.2026. П. 7 строился с сохранением сессии HMAC гостя, п. 8 сделал гостей учётными записями identity; интеграция следует п. 8, как и этот регламент: в режиме identity учётная запись гостя входит на странице identity (приложение подставляет имя гостя подсказкой), путь HMAC остаётся только у чат-доступа гостя встречи.
  5. Боты платформы — сделано 01.10.2026 (ADR-0047 §8a п. 8, «The platform's own bots»): бот поддержки входит по ключу своего хоста, переключатель проверяет его наличие (п. 7 проверок). Отдельного «системного владельца» нет: владелец — администратор, проводивший настройку.
  6. Отказоустойчивость identity. ADR требует пары узлов и реплицируемой базы; обязательна ли она до переключения и для каких установок — не решено. Переключение адресов ключей и ленты между узлами собрано отдельно и не выпущено.
  7. ST_TOKEN_SECRET. Порядок в §8a удаляет его с переключением, но служебные токены подписываются им, пока п. 4 не включён — п. 4 выпущен выключенным (service_token: hmac), и удаление секрета ждёт service_token: keys на всём парке.
  8. Назначение доступа. Из сервисов ленту подготовки читает только календарь; messaging, mail, drive и телефония — нет. Включать provisioning к переключению или позже — не решено.
  9. Длительность стабильного периода и критерий, после которого начинаются удаления раздела 5, не заданы; после них отката нет.
  10. Откат для ботов и гостей, созданных в режиме identity, не описан (раздел 4).
  11. Звонки, идущие в момент переключения: перезапуск messaging может их оборвать; стоит ли ждать окна без звонков — не решено.
  12. Windows-клиент входит через identity не сделан; если он есть в установке, его пользователи после переключения не войдут.