Gateway
Семантика учётных данных аутентификации
Эта семантика обеспечивает согласованность поведения аутентификации при выборе и во время выполнения. Она используется совместно в:
resolveAuthProfileOrder(порядок профилей)resolveApiKeyForProfile(разрешение учётных данных во время выполнения)openclaw models status --probe- проверках аутентификации
openclaw doctor(doctor-auth)
Стабильные коды причин проверки
Результаты проверки содержат категорию status (ok, auth, rate_limit, billing, timeout, format, unknown, no_model), а также стабильный код reasonCode, если проверка не дошла до вызова модели:
reasonCode |
Значение |
|---|---|
excluded_by_auth_order |
Профиль исключён из явно заданного порядка аутентификации для своего провайдера. |
missing_credential |
Встроенные учётные данные или SecretRef не настроены. |
expired |
Значение expires токена находится в прошлом. |
invalid_expires |
expires не является допустимой положительной меткой времени Unix в мс. |
unresolved_ref |
Не удалось разрешить настроенный SecretRef. |
ineligible_profile |
Профиль несовместим с конфигурацией провайдера (включая некорректный ключ). |
no_model |
Учётные данные существуют, но не удалось определить модель-кандидат для проверки. |
Проверки допустимости сообщают ok как код причины для пригодных учётных данных.
Учётные данные токена
Учётные данные токена (type: "token") поддерживают встроенные token и/или tokenRef.
Правила допустимости
- Профиль токена недопустим, если отсутствуют и
token, иtokenRef(missing_credential). expiresнеобязателен. Если он задан, это должно быть конечное число миллисекунд с начала эпохи Unix, превышающее0и не превышающее максимальную метку времени JavaScriptDate(8640000000000000).- Если
expiresнедопустим (неверный тип,NaN,0, отрицательное или неконечное значение либо превышение этого максимума), профиль недопустим с кодомinvalid_expires. - Если
expiresнаходится в прошлом, профиль недопустим с кодомexpired. tokenRefне позволяет обойти проверкуexpires.
Правила разрешения
- Семантика средства разрешения для
expiresсоответствует семантике допустимости. - Для допустимых профилей содержимое токена может быть получено из встроенного значения или
tokenRef. - Неразрешимые ссылки приводят к
unresolved_refв выводеmodels status --probe.
Переносимость копий агента
Наследование аутентификации агентом выполняется сквозным чтением. Если у агента нет локального профиля, во время выполнения он разрешает профили из хранилища агента по умолчанию/основного агента, не копируя секретные данные в собственное хранилище учётных данных (agents/<agentId>/agent/openclaw-agent.sqlite).
Явные операции копирования, такие как openclaw agents add, используют следующую политику переносимости:
- Профили
api_keyиtokenпереносимы, если толькоcopyToAgents: false. - Профили
oauthпо умолчанию непереносимы, поскольку токены обновления могут быть одноразовыми или зависеть от ротации. - OAuth-потоки, принадлежащие провайдеру, могут явно включить переносимость с помощью
copyToAgents: true, только если известно, что копирование данных обновления между агентами безопасно; это разрешение применяется только тогда, когда профиль содержит встроенные данные токена доступа/обновления.
Непереносимые профили остаются доступными через наследование со сквозным чтением, если целевой агент не выполнит отдельный вход и не создаст собственный локальный профиль.
Маршруты аутентификации только из конфигурации
Записи auth.profiles с mode: "aws-sdk" являются метаданными маршрутизации, а не сохранёнными учётными данными. Они допустимы, когда целевой провайдер использует models.providers.<id>.auth: "aws-sdk" — маршрут, записываемый настройкой Amazon Bedrock, принадлежащей плагину. Идентификаторы этих профилей могут встречаться в auth.order и переопределениях сеанса, даже если в хранилище учётных данных нет соответствующей записи.
Не записывайте type: "aws-sdk" в хранилище учётных данных; сохранёнными учётными данными могут быть только api_key, token или oauth. Если устаревший auth-profiles.json содержит такой маркер, openclaw doctor --fix перемещает его в auth.profiles и удаляет маркер из хранилища.
Фильтрация по явно заданному порядку аутентификации
- Если для провайдера задано
auth.order.<provider>или переопределение порядка в хранилище аутентификации,models status --probeпроверяет только те идентификаторы профилей, которые остались в разрешённом порядке аутентификации для этого провайдера. Сохранённое переопределение имеет приоритет над конфигурациейauth.order. - Сохранённый профиль этого провайдера, исключённый из явно заданного порядка, не проверяется неявно позднее. В выводе проверки для него указываются
reasonCode: excluded_by_auth_orderи подробностьExcluded by auth.order for this provider.
Разрешение цели проверки
- Цели проверки могут поступать из профилей аутентификации, учётных данных окружения или
models.json(результатsource:profile,env,models.json). - Если у провайдера есть учётные данные, но OpenClaw не может определить для него модель-кандидат, пригодную для проверки,
models status --probeсообщаетstatus: no_modelсreasonCode: no_model.
Обнаружение учётных данных внешних CLI
- Учётные данные только для времени выполнения, принадлежащие внешним CLI (Claude CLI для
claude-cli, Codex CLI дляopenai, MiniMax CLI дляminimax-portal), обнаруживаются только тогда, когда провайдер, среда выполнения или профиль аутентификации входит в область текущей операции либо уже существует сохранённый локальный профиль для этого внешнего источника. - Вызывающий код хранилища аутентификации выбирает явный режим обнаружения внешних CLI:
noneтолько для сохранённой аутентификации/аутентификации плагина,existingдля обновления уже сохранённых профилей внешних CLI илиscopedдля конкретного набора провайдеров/профилей. - Пути только для чтения/получения состояния передают
allowKeychainPrompt: false; они используют только файловые учётные данные внешних CLI и не считывают и не используют повторно результаты macOS Keychain.
Защитная политика OAuth для SecretRef
Ввод SecretRef предназначен только для статических учётных данных. Учётные данные OAuth изменяются во время выполнения (потоки обновления сохраняют ротированные токены), поэтому OAuth-данные на основе SecretRef разделили бы изменяемое состояние между хранилищами.
- Если учётные данные профиля имеют тип
type: "oauth", объекты SecretRef отклоняются для любого поля с данными учётных данных в этом профиле. - Если
auth.profiles.<id>.modeимеет значение"oauth", вводkeyRef/tokenRefна основе SecretRef для этого профиля отклоняется. - Нарушения приводят к жёстким сбоям (выбрасываемым ошибкам) в путях подготовки секретов при запуске/перезагрузке и разрешения профилей.
Сообщения с поддержкой устаревших сценариев
Для совместимости со сценариями первая строка ошибок проверки остаётся неизменной:
Auth profile credentials are missing or expired.
Понятные человеку подробности и стабильный код причины следуют в последующих строках в формате ↳ Auth reason [code]: ....