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

ADR-0011: Учётные данные и сеансы входа

Статус: Принято — 2026-09-23. Владелец проекта утвердил это решение. Принятие фиксирует архитектурный контракт; оно не означает готовую реализацию или успешное прохождение невыполненных проверок.

Принятое уточнение — 2026-09-24: учётные данные, личность субъекта, идентичность действующего клиента и полномочия задачи остаются раздельными при CLI, MCP и делегировании. Исходная дата принятия, сроки аутентификации и невыполненные проверки не изменяются.

English | Русский

ADR-0005 разделяет установление личности, проверку доступа и поиск расширений за доверенной границей ядра. ADR-0007 также нужны учётные данные для разрешённых источников артефактов. Их защищённые ссылки должны иметь единый смысл для разных фирменных CLI, нескольких работающих процессов CLI, пользовательских учётных записей и служебных идентичностей без взаимодействия с человеком. Успешный вход, пригодный токен API и разрешение действия — разные факты.

ADR-0003 подтверждает владение закрытым каналом процесса конкретного вызова. Такой сеанс IPC не является сеансом входа и не даёт общих полномочий на учётные данные. ADR-0002 оставляет личность под управлением ядра, а ADR-0004 уже запрещает новые защищённые действия после отмены или начала завершения. Использование учётных данных должно соблюдать эти границы.

Открытому базовому варианту из ADR-0009 не нужны ни вход в организацию, ни хранилище учётных данных. Этот ADR определяет дополнительный контракт, когда выбранной интеграции личности, сервиса или реестра нужны секреты. ADR-0012 отдельно определяет действительность решений о доступе; этот документ не делит расширения по доступности сети или частоте проверок доступа.

  • Оставить данные входа и общие учётные данные сервисов и реестров внутри доверенных интеграций ядра.
  • Сохранить точные привязки к полномочной стороне, учётной записи, получателю и настройкам владельца без случайного совместного использования разными CLI.
  • Поддержать защищённое ОС постоянное хранение и явный режим только в текущем процессе через переносимые зарегистрированные адаптеры.
  • Упорядочить обновление и отмену действия между процессами, включая сбои, ротацию токенов обновления и поздние ответы.
  • Сделать локальный выход сохраняющимся после перезапуска и явно сообщать об ошибках удаления, недоступном хранилище и удалённом отзыве.
  • Поддержать пользовательский вход и явно настроенные служебные идентичности без скрытых интерактивных действий.
ВариантПреимуществоОграничение
Учётные данные в каждом расширении или его окруженииПростые прямые обращения к APIРаскрывает общие полномочия и дублирует правила выбора учётной записи, обновления и отзыва
Автоматический переход к открытому текстовому файлу при отсутствии защищённого хранилищаРаботает в минимальном окруженииНезаметно меняет срок хранения и защиту секретов
Один зашифрованный файл с секретом, встроенным в CLIЕдиный формат храненияСекрет, распространяемый вместе с клиентом, не создаёт защищённой границы хранения
Адаптеры защищённого хранения ОС с блокировками только внутри процессаИспользует платформенное хранилищеПараллельные CLI могут повторно использовать ротируемый токен обновления или опубликовать данные после выхода
Контракт ядра, защищённые адаптеры и единый сохраняющий состояние координаторЯвная область действия, ротация и отмена действия между экземплярами CLIНужны устойчивые к сбоям метаданные, проверка возможностей платформы и проверки восстановления

Ядро владеет сеансами входа и общими учётными данными личности, сервисов и реестров. Доверенные зарегистрированные адаптеры реализуют хранение секретов и аутентификацию. Постоянные сеансы используют общий локальный координатор для атомарных переходов метаданных; хранение только в процессе выбирается явно. Расширения получают результаты ограниченных сервисных операций либо отдельно разрешённые ограниченные учётные данные, но не общий интерфейс хранилища.

ADR-0010 определяет регистрацию в фирменном CLI. При сборке и настройке владелец выбирает пространство учётных данных, разрешённые профили подключения, адаптер хранилища, адаптеры аутентификации и их возможности. Дескриптор, каталог, сообщение расширения или ответ провайдера не могут установить адаптер, выбрать хранилище или изменить пространство имён. Хранилище — ответственность библиотеки; отдельный фоновый сервис учётных данных не обязателен.

РежимВыбранное поведение
persistentХранить секретные данные через зарегистрированный адаптер защищённого хранения ОС; сохранять барьеры недействительности сеансов и ссылки в общем координаторе для этой учётной записи ОС и точного пространства владельца. Это стандартный вариант для профилей, которым требуется постоянное хранение.
volatileХранить секреты, сеансы и состояние координации только в текущем процессе ядра. До аутентификации нужен явный разрешённый владельцем выбор; состояние показывает срок жизни в пределах процесса. Возобновить такой сеанс после выхода из процесса или через другой процесс CLI нельзя.
Учётные данные не нужныИспользовать явный локальный субъект и открытые/локальные правила. Не инициализировать хранилище и не требовать входа только для показа справки или работы этого базового варианта.

Постоянные адаптеры могут использовать Windows Credential Manager, macOS Keychain или разрешённую реализацию Secret Service на поддерживаемой настольной системе. Эти средства различаются доступностью, размером записей, разблокировкой и управлением доступом; зарегистрированный адаптер объявляет фактические возможности. Само их наличие не устанавливает общих гарантий транзакций или изоляции приложений. Запись учётных данных Windows, Apple Keychain services, Ограничения управления доступом Secret Service.

Неподдерживаемое, заблокированное или недоступное постоянное хранилище возвращает типизированную ошибку. Автоматические переходы к открытому текстовому файлу, экспорту в окружение, другой учётной записи ОС, произвольной вспомогательной программе или режиму volatile запрещены. Явно выбранная попытка в режиме volatile использует новый сеанс и не импортирует недоступный постоянный сеанс. Разблокировка учитывает объявленный интерактивный режим действия; неинтерактивная операция не может неожиданно открыть запрос ОС.

Принятая схема отделяет использование секретов от операций для расширения; стрелки не означают отдельные процессы.

Принятая граница владения учётными данными
Принятая граница владения учётными даннымиРасширения запрашивают ограниченные операции ядра. Доверенные адаптеры личности, сервисов и источников получают использование учётных данных для конкретного запроса через координатор ядра. Координатор хранит барьеры недействительности сеансов и передаёт секретные данные выбранному защищённому адаптеру или явно выбранному адаптеру хранения в памяти.Командное расширениеГраница действий ядраДоверенный адаптерличности, сервиса илиисточникаКоординатор учётныхданных и сеансовЗащищённое или явновыбранное хранение впамятиПровайдер личности,сервис или реестрЗапрос ограниченнойоперацииПроверенный контекст иразрешённая цельИспользование данных дляконкретного запросаОпубликованная ссылка насекретТекущая эпоха сеансаТолько разрешённая цельПринятая граница владения учётными даннымиРасширения запрашивают ограниченные операции ядра. Доверенные адаптеры личности, сервисов и источников получают использование учётных данных для конкретного запроса через координатор ядра. Координатор хранит барьеры недействительности сеансов и передаёт секретные данные выбранному защищённому адаптеру или явно выбранному адаптеру хранения в памяти.Командное расширениеГраница действий ядраДоверенный адаптерличности, сервиса илиисточникаКоординатор учётныхданных и сеансовЗащищённое или явновыбранное хранение впамятиПровайдер личности,сервис или реестрЗапрос ограниченнойоперацииПроверенный контекст иразрешённая цельИспользование данных дляконкретного запросаОпубликованная ссылка насекретТекущая эпоха сеансаТолько разрешённая цель

Логические ключи, записи и привязки субъекта

Заголовок раздела «Логические ключи, записи и привязки субъекта»

Эти логические типы не зависят от языка SDK и физического устройства хранилища. Они не задают новый публичный метод IPC или схему настроек. Для точного выбора учётных данных используется полный ключ; отсутствие поля никогда не означает выбор любого значения.

ПолеЗначение и проверка
ownerNamespaceПостоянный идентификатор границы учётных данных данного продукта CLI, назначенный владельцем. Название бренда, имя исполняемого файла и общий издатель токенов не объединяют пространства. Совместное использование или перенос требуют явной настройки владельца и проверки.
profileId, accessDomainПостоянный ID разрешённого профиля подключения и область доступа, в которой используются эти учётные данные. ownerConfigRevision фиксирует точную разрешённую регистрацию и доверенные привязки; изменение настроек требует повторной проверки совместимости перед использованием.
authority, subjectKind, subjectПроверенная полномочная сторона учётных данных и постоянный ID учётной записи; subjectKind равен user или service. Токен личности использует проверенные издателя и субъекта. Адаптер сервиса/реестра использует зарегистрированную полномочную сторону и проверенное сопоставление учётной записи; одного имени пользователя недостаточно.
audience, scopesТочный разрешённый получатель и канонический конечный набор областей полномочий. Сохраняются заданные протоколом регистр и написание; сортировка и удаление повторов не расширяют набор. Разные получатели/области остаются отдельными записями даже для одной учётной записи или имени узла.
authFlow, clientId, purposeЗарегистрированный способ аутентификации, регистрация приложения, где она применима, и назначение identity, service или registry. Явно неприменимый clientId — помеченное отсутствие, а не произвольное значение. Общий ID клиента не объединяет учётные записи или бренды.
credentialRefНепрозрачная ссылка ядра на одну выбранную запись учётных данных. Это не секрет, не разрешение доступа и не селектор, принимаемый от расширения. Для разрешения ссылки нужны текущие доверенные действие, цель, привязка и срок.
credentialRevisionМонотонно растущая версия записи для сравнения с последующей заменой (CAS) и ротации токена обновления. Новый секрет не может перезаписать более новую версию.
authSessionId, sessionEpochСозданный ядром идентификатор сеанса аутентификации и монотонно растущий сохраняемый барьер недействительности. Они отличаются от ID сеанса IPC из ADR-0003 и никогда не служат предъявляемыми учётными данными. ID сеансов не используются повторно.
accountSelectionRevisionВерсия CAS выбранной учётной записи для будущих вызовов этого профиля. Она не переписывает существующий вызов.

Полный credentialKey содержит ownerNamespace, profileId, accessDomain, authority, subjectKind, subject, audience, scopes, authFlow, clientId и purpose. До проверки личности попытка входа имеет отдельный случайный ID попытки; предполагаемые сведения о субъекте не могут зарезервировать или перезаписать ключ учётных данных. Секреты связаны с полными метаданными внутри защищённых данных, поэтому подмена записи хранилища ОС не проходит проверку. Для поиска в хранилище используются непрозрачные ID без токенов, адресов электронной почты и исходных ID субъектов. Например, атрибуты поиска Secret Service не являются секретным хранилищем. Атрибуты поиска Secret Service.

principalBinding сохраняет поля kind, bindingId, квалифицированный полномочной стороной subject и регистрацию провайдера личности из ADR-0005. Для проверенного субъекта authenticationContext равен {authSessionId, sessionEpoch, authenticationExpiresAt}. Каждый новый вход или выбор учётной записи создаёт новый bindingId. У локального субъекта нет вымышленного сеанса аутентификации. Правила постоянных ID субъекта определяет его полномочная сторона; OIDC использует издателя и sub, а не отображаемое имя или адрес электронной почты. Постоянство субъекта OIDC.

OIDC требует проверять exp при принятии ID token и явно отделяет его истечение от срока сеанса аутентификации. Ответ обновления может не содержать ID token; любой возвращённый ID token подчиняется правилам проверки ответа обновления. Семантика ID token OIDC, Проверка ID token, Ответ обновления.

Поэтому решение устанавливает три отдельные границы действительности: принятие подтверждения аутентификации, сеанс аутентификации ядра и использование каждых учётных данных API. При входе адаптер проверяет актуальное подтверждение и требуемый профилем уровень аутентификации до создания сеанса. authenticationExpiresAt фиксируется при установлении сеанса по конечному, не продлеваемому активностью сроку владельца, с предельным значением по умолчанию 12 часов. Более ранний достоверный срок сеанса, полученный от зарегистрированного провайдера/адаптера, сокращает его. Если профиль ограничивает давность исходной аутентификации пользователя, адаптер должен получить и проверить auth_time и ограничить сеанс этой давностью; обязательные поля уровня аутентификации, например acr, должны соответствовать объявленному сопоставлению владельца. Отсутствие обязательного подтверждения отклоняет вход. Профиль, которому нужен достоверный срок сеанса провайдера, не может заменить его локальным стандартным значением при недоступности.

Поле exp исходного ID token не становится автоматически сроком сеанса ядра. Ядро сохраняет проверенную привязку и происхождение исходного подтверждения; просроченный ID token никогда не предъявляется как новое доказательство аутентификации. Продолжающийся локальный сеанс по политике владельца не утверждает, что собственный сеанс провайдера всё ещё существует или что доступ остаётся разрешённым. Каждые фактически используемые учётные данные API сохраняют отдельные срок издателя/адаптера и проверку при использовании. Ни сохранённый refresh token, ни новый access/ID token не продлевают authenticationExpiresAt. Для продления срока аутентификации ядра нужен новый явный вход либо явно запрошенная неинтерактивная операция аутентификации и новая привязка. Изменение политики владельца может сократить срок или отменить действительность существующего контекста, но не продлить его незаметно.

Обновление токена может сохранить bindingId, authSessionId и sessionEpoch только в пределах исходного срока и при тех же проверенных полномочной стороне, типе/ID субъекта, регистрации, цели и границах полномочий. Меняется credentialRevision. Суженная или изменённая личность/полномочная сторона/область полномочий не может незаметно заменить привязку вызова; прежний контекст становится недействительным и нужен новый. Связанные записи с одним семейством ротируемых refresh token также имеют общий refreshFamilyId, принадлежащий координатору; обновление любого участника упорядочивает работу со всем семейством. Сопоставление семейств задаёт доверенный адаптер аутентификации, а не расширение или предположение о непроверенном поле токена.

Контракт доверенных операций и ограниченное использование

Заголовок раздела «Контракт доверенных операций и ограниченное использование»

Каждая операция содержит созданный ядром requestId, ID владеющего действия activityId, точные профиль/настройки, срок и сигнал отмены. Изменяющие операции содержат ожидаемые эпоху сеанса и версии записи/выбора. Координатор проверяет входные данные до выделения памяти и обращения к хранилищу. ID запроса связывает события; он не делает удалённый обмен аутентификации идемпотентным.

Логическая операцияВход и успешный результат
inspectSessionТочный доверенный профиль/выбор учётной записи; возвращает безопасные метаданные, режим хранения и состояние. Не извлекает секреты, не обновляет их и не выполняет вход.
signInРазрешённый способ входа, запрошенные точные цель/полномочия, интерактивный режим и ожидаемая версия выбора; возвращает новую проверенную и зафиксированную привязку с защищёнными ссылками. Неполные или незафиксированные учётные данные не означают успешный вход.
useCredentialРегистрация доверенного компонента, действие, опубликованная ссылка, цель/назначение и требуемый остаточный срок; предоставляет ограниченное использование внутри доверенной интеграции после всех проверок контекста. Возвращает результат операции, но не общий токен через IPC расширения.
renewCredentialТочные ссылка/семейство, эпоха сеанса и ожидаемая версия учётных данных; публикует одну проверенную замену или типизированную ошибку. Не подразумевает открытия браузера или смены учётной записи.
selectAccountЯвная точная проверенная учётная запись, ожидаемая версия выбора и совместимый разрешённый профиль; фиксирует новые выбор/привязку и делает предыдущий выбранный контекст аутентификации недействительным. Недоступная/просроченная цель требует аутентификации, а не перепривязки по имени.
signOutЯвная область сеанса или профиля и ожидаемая версия выбора; отдельно возвращает localInvalidation, secretCleanup и remoteRevocation. Никогда не сообщает об успехе при неподтверждённой локальной отмене действия.

useCredential доступна только доверенным зарегистрированным компонентам. Компонент должен соответствовать цели записи, доверию к транспорту, назначению и привязанной личности. Он получает краткоживущий дескриптор использования или представление секрета для одной операции и освобождает его при завершении/отмене; общую ссылку на учётные данные нельзя сохранять в результате для расширения. Перед допуском фактического защищённого действия выполняется окончательная проверка координатора. Чтение секрета и его обновление сами по себе не разрешают действие; решение о доступе по-прежнему определяется ADR-0012.

Профиль объявляет renewalMode: on-demand / explicit-only; выбранный стандартный вариант — on-demand, если зарегистрированный адаптер поддерживает обновление. Он может выполнить одно ограниченное неинтерактивное обновление до допуска операции, если остаточного срока учётных данных недостаточно, а сам контекст аутентификации ещё действует. explicit-only вместо этого возвращает authentication_required с причиной необходимости обновления. inspectSession, базовая справка, дополнение команды и describe никогда не обновляют учётные данные; контекстная справка сохраняет существующие предварительные условия ADR-0002. Ни один режим не начинает новый вход, не продлевает привязку и не повторяет уже начатое защищённое действие. Отсутствие поддержки обновления или его ошибка остаются явными.

Загрузчик может использовать учётные данные реестра только со своей разрешённой привязкой источника. Служебные учётные данные провайдера доступа аутентифицируют подключение к нему; они не подменяют субъекта запрашивающего пользователя. Отзыв независимого сеанса реестра/сервиса останавливает зависящие от него действия, но не создаёт другую личность пользователя и не отменяет все несвязанные пользовательские сеансы. Выход пользователя делает недействительными его сеанс и производные учётные данные, а не все независимые служебные записи в хранилище ОС.

Общие секреты входа, обновления, подключения к провайдеру и реестру никогда не попадают в аргументы вызова, наследуемое окружение, журналы, stdout, дескрипторы, каталоги или IPC расширения. Отдельно зарегистрированная операция ADR-0002 может выдать намеренно ограниченные учётные данные только после собственной проверки действия/ресурса, с явными получателем, полномочиями, сроком и правилами отзыва; она не может вернуть общие ссылки этого хранилища или refresh token. Перенаправления источников проверяются повторно и никогда не переносят учётные данные на другой origin, сохраняя ADR-0007.

Интерактивный OIDC использует внешний браузер, Authorization Code с PKCE S256, разрешённое перенаправление на loopback, сопоставление запроса и проверку токенов из ADR-0005. Слушатель и временное состояние закрываются при завершении, ошибке, истечении срока или отмене. Rukh не собирает пароль учётной записи и не встраивает общий секрет конфиденциального клиента в распространяемый CLI. Это соответствует границе публичного нативного клиента. OAuth для нативных приложений.

Авторизация устройства выбирается явно и поддерживается зарегистрированным профилем провайдера. Взаимодействие показывает только разрешённый адрес подтверждения и пользовательский код через терминал ядра; соблюдает интервалы опроса, slow_down, истечение срока и отмену. Она не служит запасным вариантом после ошибки браузера и не является способом автономной работы CI. Device Authorization Grant.

CI и служебные учётные записи выбирают зарегистрированный неинтерактивный адаптер и subjectKind=service. Поддерживаемые варианты могут включать внешне выданные учётные данные рабочей нагрузки, платформенную/доменную идентичность или способ входа конфиденциального клиента, использование секрета/закрытого ключа которого предоставляет разрешённый адаптер учётных данных. OAuth client credentials предназначен для конфиденциальных клиентов; распространение одного общего секрета в каждом CLI не соответствует такому устройству. OAuth client credentials. Общий контракт требует проверенной служебной личности и ограниченных полномочий для цели; он не утверждает, что каждый адаптер поддерживает любой способ входа.

Выданный секрет поступает через разрешённый адаптер или явно запрошенный защищённый канал ввода, но не через аргумент командной строки со значением токена и не через неявный поиск в окружении. Разрешённая владельцем интеграция CI может принять секрет через свой явно названный защищённый механизм передачи внутри доверенного адаптера; значение исключается из наследуемого окружения расширений и диагностики. Это не превращает содержимое окружения в проверенную личность. Неинтерактивные операции возвращают interaction_required, если нужны браузер, подтверждение кода устройства или запрос разблокировки. Справка, поиск, дополнение команды и обычный защищённый запрос никогда не начинают вход скрытно.

Вход подготавливает новые учётные данные и проверяет их до CAS выбора. Ошибка или отмена до начала публикации метаданных оставляет прежний выбор без изменений с учётом его текущей действительности. Успешная замена атомарно делает прежний выбранный сеанс недействительным и публикует новые выбор/привязку. После начала публикации прерванная или неподтверждённая запись возвращает commit_unknown; ядро сверяет сохранённый ID операции до сообщения о том, какой выбор действует. Оно не предполагает, что прежний выбор сохранился, и не откатывает зафиксированную замену из-за поздней отмены. Параллельный выход или смена выбора отклоняют устаревший CAS; поздний callback не может выбрать учётную запись или восстановить прежний сеанс. Пользователь должен явно повторить отклонённый вход; ядро не воспроизводит уже использованный код авторизации, а неопределённая публикация сверяется до новой попытки.

Постоянная координация и ротация при обновлении

Заголовок раздела «Постоянная координация и ротация при обновлении»

Все согласованно работающие экземпляры с одним постоянным пространством и учётной записью ОС используют единый локальный координатор ядра. Он ведёт устойчивые к сбоям метаданные с атомарным CAS, сохраняемый журнал ожидающих/зафиксированных переходов и обеспеченное ОС взаимное исключение для коротких локальных транзакций. Сетевые запросы не выполняются во время такой транзакции. Конкретная платформенная реализация должна продемонстрировать эти свойства до объявления поддержки постоянного режима; одной записи в хранилище секретов ОС для них недостаточно.

Координатор определяет опубликованные ссылки, эпохи сеансов, выбор учётной записи и состояние семейств обновления. Он никогда не восстанавливает действующие сеансы сканированием записей хранилища секретов. Метаданные не содержат секретных байтов и доступны в ОС только владельцу; закрытые сведения о личности получают такие же ограничения доступа. Секреты занимают неизменяемые слоты версий через защищённый адаптер. Публикация идёт в следующем порядке:

  1. Надёжно сохранить ID операции и ожидаемые эпоху/версии в транзакции метаданных.
  2. Записать кандидат в новый защищённый слот и подтвердить запись. Не перезаписывать действующий слот на месте.
  3. Через CAS опубликовать ссылку при тех же ожидаемых барьере/версиях; надёжно зафиксировать метаданные до сообщения об успехе.
  4. Удалить старые/подготовленные слоты без ссылок с ограниченным временем очистки. При ошибке сохраняется защитная запись и сообщается о незавершённой очистке; неопубликованный секрет не становится пригодным к использованию.

Читатели следуют только зафиксированным ссылкам и проверяют вложенные метаданные. Новое пространство явно инициализируется с новым идентификатором хранилища до первого входа; инициализация не импортирует существующие слоты секретов. Отсутствие состояния в ранее инициализированном пространстве, повреждённое или неоднозначное состояние координатора означает storage_error, а не пустое успешно очищенное хранилище. При запуске восстанавливаются зафиксированные переходы, а незавершённые удалённые обмены помечаются неопределёнными до любого зависящего от них действия. Запуск не понижает режим до volatile и не восстанавливает старые учётные данные из резервной копии. Перенос хранилища должен сохранить барьеры недействительности либо явно сделать все перенесённые сеансы недействительными; копирование одних защищённых слотов не импортирует учётную запись.

У семейства не более одного обновления в работе между всеми процессами. Победитель надёжно фиксирует refresh_started до отправки запроса обновления. Остальные вызовы ждут в пределах своих сроков, затем перечитывают зафиксированную версию либо получают credential_busy; они не отправляют ещё один запрос. Ротация вместе публикует заменяющие данные access/refresh token. После фиксации замены использовать старый refresh token нельзя. Защита от повторного использования refresh token публичного клиента и его ротация — протокольные требования на сервере авторизации; описанное локальное упорядочение является дополнительным проектным решением Rukh. Рекомендации OAuth по refresh token.

Потерянный ответ, гибель процесса после refresh_started или ошибка публикации после, возможно, успешного обмена дают refresh_uncertain. Координатор блокирует семейство и делает его сеанс аутентификации недействительным; для восстановления нужна явная аутентификация с созданием нового сеанса. Тайм-аут или истечение блокировки никогда не разрешают повторить использование старого refresh token. Даже настроенное число повторов не отменяет этого правила. Сбой, доказанно случившийся до любого удалённого обмена, может вернуть допускающую повтор транспортную ошибку; протокольное отклонение, например invalid_grant, делает сеанс непригодным. Ошибка аутентификации API никогда не приводит к автоматическому повтору защищённой операции, даже если обновление позже удалось.

Принятая последовательность показывает порядок, когда выход опережает обновление. Уже начатые удалённые эффекты остаются возможными.

Принятая гонка обновления и выхода
Принятая гонка обновления и выходаОдин CLI фиксирует владение обновлением до обращения к провайдеру. Второй CLI надёжно делает сеанс недействительным. Поздний ответ обновления не проходит сравнение эпохи, не публикуется и не может восстановить учётную запись после выхода.Экземпляр CLI BПровайдер личностиОбщий координаторЭкземпляр CLI AЭкземпляр CLI BПровайдер личностиОбщий координаторЭкземпляр CLI AЗарезервировать обновление семейства при эпохе E и версии Rrefresh_started сохранёнОдин обмен обновленияВыполнить выход из ожидаемого сеансаЗафиксировать эпоху E+1, отменить привязки и убрать ссылкиЛокальная отмена подтверждена, состояние очисткиЗаменяющие учётные данныеПубликовать, только если эпоха E и версия R совпадаютcontext_invalidatedОтбросить подготовленный секрет и ограничить удалённую очисткуПринятая гонка обновления и выходаОдин CLI фиксирует владение обновлением до обращения к провайдеру. Второй CLI надёжно делает сеанс недействительным. Поздний ответ обновления не проходит сравнение эпохи, не публикуется и не может восстановить учётную запись после выхода.Экземпляр CLI BПровайдер личностиОбщий координаторЭкземпляр CLI AЭкземпляр CLI BПровайдер личностиОбщий координаторЭкземпляр CLI AЗарезервировать обновление семейства при эпохе E и версии Rrefresh_started сохранёнОдин обмен обновленияВыполнить выход из ожидаемого сеансаЗафиксировать эпоху E+1, отменить привязки и убрать ссылкиЛокальная отмена подтверждена, состояние очисткиЗаменяющие учётные данныеПубликовать, только если эпоха E и версия R совпадаютcontext_invalidatedОтбросить подготовленный секрет и ограничить удалённую очистку

Выход, смена учётной записи и допуск действий

Заголовок раздела «Выход, смена учётной записи и допуск действий»

Успешный выход в постоянном режиме сначала фиксирует запись недействительности с увеличенной эпохой сеанса, делает его ID привязок недействительными, убирает все опубликованные ссылки на производные от сеанса учётные данные и очищает затронутый выбор. Эта сохраняемая фиксация — граница локального выхода. Удаление секретов и необязательный удалённый отзыв идут после неё и не могут её отменить. Повторный выход из того же уже недействительного сеанса идемпотентен; выход из другой учётной записи/профиля требует их явных области и версии.

Каждое новое защищённое действие, включая использующее закэшированное разрешение или находящееся в памяти процесса представление секрета, сравнивает привязанные к вызову эпоху сеанса и срок аутентификации с координатором. Допуск и отмена действия упорядочены локальной транзакцией координатора. Допуск означает достижение доверенной реализацией границы начала защищённого действия, а не обещание в очереди для будущего использования; отложенная работа должна повторить проверку на этой границе. Уведомления могут раньше убрать закэшированное состояние, но корректность никогда не зависит от их доставки или интервала опроса. Если постоянный координатор нельзя прочитать, защищённые действия, которым нужен этот сеанс, останавливаются.

Действие, допущенное до отмены, может завершиться или иметь неопределённый результат. Переданный токен нельзя забрать обратно у внешнего сервиса. Нативные процессы расширений сохраняют обычные возможности ОС: контракт ядра не помещает их в песочницу и не гарантирует принудительное завершение средствами ядра ОС или откат. Первая принятая причина отмены и единый бюджет завершения из ADR-0004 не меняются. Очистка и обязательный аудит сохраняют только ранее установленную область; они не могут вновь открыть обычные защищённые запросы.

Существующий вызов никогда не перепривязывается к новой выбранной учётной записи. Смена учётной записи и новый вход делают прежний выбранный контекст аутентификации недействительным; старые вызовы получают context_invalidated для дальнейших защищённых действий. Новый вызов получает новую привязку. Истечение срока возвращает authentication_required с безопасной причиной expired; известная отмена действия возвращает context_invalidated. Пригодность учётных данных проверяется отдельно от действительности разрешения из ADR-0012, а отмена аутентификации сразу делает закэшированные решения этой привязки непригодными.

Поле результата выходаЗначения и смысл
localInvalidationconfirmed только после надёжной фиксации барьера либо фиксации барьера в процессе для явно выбранного режима volatile; иначе unconfirmed с storage_error.
secretCleanupcomplete, pending или failed; достоверно отсутствующий слот означает завершённую очистку, а ошибки доступа/ввода-вывода/заблокированного хранилища не считаются отсутствием. Сохранённые записи недействительности не дают ошибке очистки восстановить использование.
remoteRevocationconfirmed, unsupported, failed, uncertain или not_requested; подтверждение касается только настроенного запроса отзыва, а не всех сеансов сервисов/браузера.

Если надёжно сохранить отмену не удалось, вызывающий процесс блокирует сеанс в памяти и сообщает о неподтверждённом выходе; он не может обещать выход в других процессах или после перезапуска. Если барьер сохранён, но удаление не удалось, локальный выход остаётся подтверждённым с явной незавершённой очисткой. Записи недействительности сохраняются после перезапуска; сборка мусора не может удалить барьер, пока старый писатель, подготовленный слот или ссылка способны выполнить публикацию с ним. При исчерпании квоты реализация отклоняет новые входы вместо удаления защитных записей. Последующий новый вход получает новый ID сеанса и не открывает заново отменённый.

Если профиль запрашивает и поддерживает удалённый отзыв, после локального барьера он использует уже выбранную полномочную сторону и ограниченные учётные данные только для отзыва; публиковать новые пригодные данные нельзя. Транзакция выхода может сохранить для этого защищённую ссылку только для очистки; она не является действующей ссылкой на учётные данные и не проходит обычную useCredential. Сетевой отзыв выполняется по возможности, а его ошибки остаются видимыми. Успешный ответ RFC 7009 также может означать, что переданный токен уже был недействителен, а отзыв связанных токенов зависит от политики сервера. Это не доказывает выход из каждого сервиса и не очищает cookies единого входа в браузере. Отзыв токенов OAuth.

Ниже приведены выбранные консервативные значения по умолчанию, а не измерения или общие ограничения протоколов. Владелец может выбрать меньшие пределы; для большего конечного значения нужна явная поддерживаемая настройка. Ограничения адаптера/платформы действуют дополнительно. Срок провайдера может сократить действие, но никогда не увеличивает срок владельца/действия. Каждое ожидание, обмен и очистка также укладываются в остаток времени родительского действия и применимый бюджет операции. Для завершающегося вызова единый невозобновляемый бюджет остановки в 5 секунд из ADR-0004 ограничивает всю оставшуюся очистку; лимит самостоятельного выхода не добавляет к нему время. Если остатка времени недостаточно, очистка явно остаётся ожидающей с сохранением защитных ссылок.

ОграничениеПринятое значение по умолчанию
Полные защищённые данные одной записи64 KiB, дополнительно ограниченные выбранным адаптером; превышение отклоняется без неявного сохранения открытым текстом или незарегистрированного разбиения
Одно поле идентификатора/текста; точный набор полномочий2 KiB UTF-8 на поле; 64 области полномочий, не более 256 байтов каждая; управляющие символы и некорректный Unicode отклоняются
Действующие сохранённые учётные данные одного пространства256; не более 32 сеансов входа; защитные записи недействительности и ожидающих операций сохраняются в отдельной квоте на 10 000 записей
Параллельная работаОдно изменение входа/выбора на профиль; одно обновление на семейство; 32 ожидающих запроса на семейство
Интерактивный вход/подтверждение устройства5 минут с ограничением сроком провайдера и действия, согласованно с ADR-0005
Неинтерактивный обмен или обновление30 секунд всего; одна попытка обмена после refresh_started
Доступ к хранилищу/ожидание координатора; сетевая очистка при выходе5 секунд на операцию в пределах срока владеющего действия; 10 секунд всего на необязательную удалённую очистку самостоятельного выхода с дополнительным ограничением остатком родительского бюджета/бюджета остановки
Верхняя граница сеанса аутентификации ядра12 часов от установления сеанса; сокращается достоверным сроком сеанса провайдера/адаптера и требованием к давности исходной аутентификации. Срок принятия ID token и истечение учётных данных API остаются отдельными; обновление не может продлевать привязанный контекст ядра.
Запас до истечения срока30 секунд для получения пригодных учётных данных; отклонить, если остаточный срок не покрывает ограниченный запрос. Запас никогда не продлевает токен или аутентификацию.

Проверки времени сочетают проверенное абсолютное истечение с монотонным сроком внутри процесса; перевод времени назад или недостоверное время никогда не продлевают существующий контекст. После перезапуска ядро повторно проверяет абсолютное истечение, барьеры координатора и совместимость регистрации до создания привязки нового вызова. Если действительность времени установить нельзя, требуется аутентификация. Проверка максимальной длительности при допуске не обещает, что провайдер будет принимать учётные данные в течение всей операции; более ранний удалённый отзыв остаётся возможным.

Словарь ошибок: invalid_request, invalid_response, authentication_required, interaction_required, context_invalidated, unsupported, unavailable, storage_locked, storage_error, revision_conflict, commit_unknown, credential_busy, refresh_uncertain, deadline_exceeded, cancelled и limit_exceeded. Ошибки содержат безопасное сообщение и определённую операцией причину; адаптеры хранилища отличают достоверное отсутствие от сбоя. Ни одна ошибка не превращается в успешный выход, анонимного/локального субъекта или разрешение. Преобразование результата вызова следует ADR-0002/0004; это не новые итоговые исходы.

Диагностика ядра может фиксировать ID действия/запроса, ID адаптера, безопасный ID профиля, переход состояния, версию, длительность и типизированную ошибку. Сведения об учётных записях минимизируются или скрываются по политике владельца. Ответы с токенами, заголовки авторизации, секреты обновления/устройства, пароли, закрытые ключи, строки запроса callback и полные тела ошибок провайдера никогда не становятся диагностикой или stdout. Пользовательский код устройства показывается только в предназначенном для него интерактивном запросе. Обязательный аудит использует существующие доверенную границу и правила ошибок; этот документ не вводит поток аудита с токенами.

Уточнение: действующие клиенты и полномочия задачи — 2026-09-24

Заголовок раздела «Уточнение: действующие клиенты и полномочия задачи — 2026-09-24»

ADR-0014 добавляет привязку задачи в ядре и отдельно установленную actorBinding, но не превращает учётные данные в полномочия задачи. principalBinding по-прежнему определяет субъекта, чьи права применяются. Локальному участнику не обязательна корпоративная учётная запись, но он не может её имитировать. Адаптер MCP получает привязку действующего клиента через доверенный настроенный путь запуска/транспорта, а не через clientInfo, аргументы инструмента, имя агента или пересланный токен субъекта.

Простой дескриптор задачи — непрозрачная taskAuthorityRef, разрешаемая через защищённое состояние и привязанная к получателю. Это не access/refresh token, не селектор хранилища учётных данных и не право по факту владения ссылкой. Делегирование проверяет более узкое дочернее полномочие и его участника по ADR-0014; оно не выдаёт потомку учётные данные родителя и не копирует его семейство обновления. Зарегистрированная служба ограниченных учётных данных сохраняет явный контракт получателя, области, срока и отзыва с дополнительными проверками задачи и текущей политики до выдачи.

Каждое использование учётных данных остаётся привязанным к точной задаче, участнику, субъекту, допустимому назначению и активности защищаемой операции. Обновление учётных данных сохраняет установленного субъекта только в пределах исходного срока аутентификации; оно не продлевает notAfter, не снимает taskEpoch, не восстанавливает отозванного предка, не пополняет бюджеты задачи и не перепривязывает вызов. Новый вход не переносит старые задачи на новую bindingId скрыто. Потерянное или недоступное состояние задачи не восстанавливается чтением учётных данных или выбором учётной записи с тем же отображаемым именем.

Окончательный допуск проверяет и действительность учётных данных/сеанса, и текущие полномочия задачи по ADR-0012/0014. Отзыв задачи блокирует новое использование учётных данных в её рамках, не изображая выход из посторонних сеансов. Напротив, выход или отзыв учётной записи исключает дальнейшее использование задач, зависящих от этого сеанса. Прежние барьеры и правила устаревших ответов обязательны. Ни одна операция не доказывает откат уже допущенного внешнего эффекта; его резерв и неопределённость сохраняются по ADR-0016.

Дополнительные проверки реализации не выполнялись: использовать одного аутентифицированного субъекта с разными привязками участника/задачи; отклонить скопированные ссылки и неразрешённое делегирование; состязать обновление/выход с истечением задачи и отзывом предка; проверить, что поздний действительный токен не восстанавливает полномочия задачи и не освобождает резерв неопределённого эффекта.

  • Небольшие открытые CLI остаются пригодными без входа, настройки защищённого хранилища или сервера. Защищённые профили имеют явные дополнительные требования.
  • Одна логическая граница поддерживает разные платформы и служебные идентичности, но каждый объявленный адаптер должен подтвердить поведение хранения, разблокировки и координации.
  • Выход и смена учётной записи останавливают дальнейшие защищённые действия через ядро между согласованно работающими постоянными экземплярами; они не могут отозвать произвольный доступ к ОС или гарантировать выход на всех серверах.
  • Сохраняемые барьеры, подготовленные слоты и CAS добавляют работу по локальному восстановлению. Консервативная обработка неопределённого обновления может потребовать повторного входа, чтобы не рисковать повторным использованием семейства токенов.
  • Действительность учётных данных и разрешение действия остаются независимо проверяемыми, а командным расширениям не нужен общий API учётных данных.

Решение принято владельцем проекта 2026-09-23. Следующий перечень сохраняется как обязательная проверка реализации, а не условие, уже выполненное при принятии.

Этот ADR не реализует адаптер учётных данных, координатор или проверки жизненного цикла аутентификации и не сообщает об их успешном прохождении. Для проверки реализации нужно рассмотреть выбранные сроки, возможности хранилищ каждой платформы и следующие эталонные проверки. До объявления реализации их нужно выполнить на фактически поддерживаемых платформах и провайдерах:

  1. Изолировать бренды/пространства, профили, полномочные стороны, пользовательских/служебных субъектов, ID клиентов, получателей, наборы полномочий и способы входа. Подмена защищённых слотов и неквалифицированные личности отклоняются без расширения доступа.
  2. Проверить открытый базовый вариант без входа, отсутствующее/заблокированное защищённое хранилище, явный выбор volatile, неинтерактивные ошибки и отсутствие перехода к открытому тексту/окружению. Проверить превышение размера данных и ограничения адаптера до публикации.
  3. Проверить сопоставление браузерного запроса, отмену, опрос устройства и неинтерактивные адаптеры. Ошибка/отмена до публикации не должна менять существующий выбор; при неопределённой публикации нужно сверить ID операции без воспроизведения или предполагаемого отката, а устаревший CAS входа не должен отменять выход.
  4. Создать гонки двух процессов при обновлении одного семейства, выборе учётной записи, выходе и поздних callback. Внести сбои до/после фиксации журнала, записи секрета, удалённого обновления и публикации. Возможно использованный refresh token никогда не воспроизводится; записи недействительности сохраняются после перезапуска, а поздние писатели не восстанавливают ссылки.
  5. Проверить отсутствующие и недоступные секреты, ошибку надёжной отмены, ошибку удаления и неудачный/неопределённый сетевой отзыв. Проверить три поля результата выхода и сохранение защитных записей, включая исчерпание квоты.
  6. Проверить допуск защищённых действий при истечении аутентификации, выходе и смене учётной записи, включая закэшированные разрешения ADR-0012 и представления секретов в памяти процесса. С короткоживущим ID token и обновляемыми учётными данными доступа проверить, что одно истечение этого токена не закрывает установленный сеанс ядра, а просроченное подтверждение не создаёт новый. Проверить более ранние достоверные сроки сеанса и требуемую давность аутентификации и доказать, что обновление не продлевает исходный срок ядра. Старые вызовы не получают нового субъекта; уже допущенные эффекты отражаются без ложных гарантий.
  7. Проверить IPC расширения, окружение дочерних процессов, терминальный вывод, журналы и аудит с различимыми тестовыми секретами. Общие учётные данные не выходят за границу; операции ограниченных учётных данных сохраняют отдельный контракт получателя/полномочий/срока.

Проверки документа и диаграмм устанавливают только согласованность документа. Ссылки на OAuth и существующие эксперименты ADR-0002/0003 не проверяют эти ещё не реализованные гарантии постоянного хранения, гонок и работы на разных платформах.

Диаграмма

Перетаскивайте схему · + / − — масштаб · 0 — целиком · Esc — закрытьПеремещайте и увеличивайте схему двумя пальцами

100%