Авторизация в Codex - это не только вопрос "как войти", но и вопрос о том, чей это биллинг, какая политика и что вообще доступно. Для OpenAI-моделей локальные клиенты поддерживают два основных пути: вход через ChatGPT и API-ключ. Codex cloud требует именно ChatGPT sign-in. Метод входа определяет не только оплату, но и workspace policy, retention и доступность облачных и connector-функций - поэтому его выбирают осознанно, а не по первому попавшемуся приглашению.
Разница между входом через ChatGPT и API-ключом принципиальна. ChatGPT sign-in привязывает работу к вашему плану и контролю workspace, включает облачные возможности и подчиняется политике аккаунта. API-ключ - это usage-based биллинг, удобный для локальных клиентов, CI и программной интеграции, но не дающий cloud-часть. Смешать их в одной среде легко, а последствия неочевидны: запрос может пойти по не тому маршруту и на не тот счёт, поэтому реальный источник всегда проверяют.
Проверяют вход не по памяти, а командой. codex login status показывает текущее состояние авторизации, codex logout сбрасывает его. Важная деталь: CLI и IDE-расширение используют общий кэшированный вход, поэтому логин в одном месте виден в другом. Это удобно, но и требует внимания: выйдя в одном клиенте, вы влияете на оба, а неожиданная смена источника входа - частая причина того, что "вчера работало, а сегодня нет".
Где лежат credentials - вопрос и удобства, и безопасности. Они могут храниться в файле $CODEX_HOME/auth.json или в системном хранилище учётных данных. Настройка cli_auth_credentials_store принудительно задаёт поведение: значение keyring выбирает системное хранилище, а auto использует его при доступности и иначе падает обратно на файл. На общих или CI-машинах системное хранилище предпочтительнее файла, который проще случайно прочитать или утащить вместе с домашним каталогом.
Полезно один раз свести методы входа в таблицу, чтобы выбирать под задачу. Ниже - карта: ChatGPT sign-in для интерактивной локальной работы и cloud, device code для headless и удалённых хостов, API-ключ для локальных клиентов, CI и usage-based биллинга. К этой карте возвращаются при смене окружения: у каждого метода своя область применения, свой биллинг и свои ограничения, и путать их - значит однажды удивиться счёту или недоступной функции.
Device code - отдельный путь для машин без удобного браузера. Он позволяет пройти вход на headless- или удалённом хосте через код подтверждения, оставаясь под теми же ChatGPT-контролями. Но это функция, которая должна быть разрешена, а не данность: доступность device-auth зависит от настроек, поэтому её наличие проверяют заранее, а не рассчитывают на неё в критичном пайплайне без проверки. Для стабильной автоматизации это скорее удобство, чем гарантия.
| Метод | Подходит для | Биллинг и policy | Команда |
|---|---|---|---|
| ChatGPT sign-in | Интерактив локально и cloud | План и controls ChatGPT-workspace | codex login |
| Device code (beta) | Headless и удалённый хост | Те же ChatGPT-controls; должен быть разрешён | codex login --device-auth |
| API key | Локальные клиенты и CI | Usage-based биллинг | переменная окружения / config |
Для CI выбор по умолчанию - API-ключ, переданный только процессу Codex, а не всему окружению job. Это не формальность, а граница безопасности. Если job запускает скрипты, управляемые репозиторием - dependency-хуки, build-шаги, - то секрет, заданный на уровне всего job, сможет прочитать скомпрометированный или недоверенный код. Ключ отдают узко: только той команде, которой он действительно нужен, и не шире.
Типичные провалы авторизации предсказуемы и дороги. Смешать ChatGPT-вход и API-ключ в одной среде и отправить запрос не на тот биллинг. Хранить credentials в файле на общей машине вместо системного keyring. Задать секрет на уровне всего CI-job и открыть его repository-controlled скриптам. И понадеяться на device-auth без проверки, что он разрешён. Проверяйте вход командой, держите credentials в безопасном хранилище и отдавайте секрет только нужному процессу.
codex login status # текущее состояние входа
codex logout # сбросить вход
codex login --device-auth # device code (если функция разрешена)
# CLI и IDE делят кэшированный вход; credentials - в $CODEX_HOME/auth.json или keyring
# cli_auth_credentials_store = "keyring" | "auto" | "file"