Codex Remote использует комбинацию из passkey/TOTP/basic-входа (в зависимости от провайдера), refresh-токенов и device-code flow для Anchor.
- Web client (Svelte)
- Orbit / control plane (
services/orbit,services/orbit-denoилиservices/control-plane) - Anchor (локальный Bun-сервис, мост к
codex app-server)
- access token (
token) используется для API/WS запросов - refresh token (
refreshToken) обновляет сессию через/auth/refresh - access token короткоживущий, refresh token - долгоживущий с ротацией
- Anchor получает
anchorAccessToken+anchorRefreshTokenпосле device-code авторизации - access token обновляется через
/auth/device/refresh - в legacy-сценариях может использоваться
CODEX_REMOTE_ANCHOR_JWT_SECRET
CODEX_REMOTE_WEB_JWT_SECRET- подпись/проверка пользовательских JWTCODEX_REMOTE_ANCHOR_JWT_SECRET- legacy service-to-service JWT для Anchor (и совместимость)
- Клиент вызывает
POST /auth/register/options+POST /auth/register/verify(регистрация) илиPOST /auth/login/options+POST /auth/login/verify(вход) - Сервер выдаёт
token+refreshToken - Клиент хранит токены и обновляет
tokenчерезPOST /auth/refresh - При выходе вызывается
POST /auth/logout
Доступно в orbit/orbit-deno при AUTH_MODE=passkey:
POST /auth/register/totp/startPOST /auth/register/totp/verifyPOST /auth/login/totpPOST /auth/totp/setup/optionsPOST /auth/totp/setup/verify
TOTP-факторы хранятся на сервере с защитой от replay (last_used_step).
POST /auth/register/basicPOST /auth/login/basic
Используется как упрощённый режим для локальной разработки и лёгкого self-host.
- Anchor:
POST /auth/device/code - Пользователь подтверждает код в web:
POST /auth/device/authorise - Anchor polling:
POST /auth/device/token - После
authorisedAnchor получает anchor-токены - Для продления сессии Anchor использует
POST /auth/device/refresh
Креды Anchor сохраняются в CODEX_REMOTE_CREDENTIALS_FILE (по умолчанию ~/.codex-remote/credentials.json).
Подключение:
wss://.../ws/client?token=<jwt>- или заголовок
Authorization: Bearer <jwt>(где применимо)
Токен валидируется по issuer/audience и по состоянию серверной сессии.
Подключение:
wss://.../ws/anchor?token=<anchorAccessToken>
В legacy-режиме Anchor может подписывать короткоживущий JWT через CODEX_REMOTE_ANCHOR_JWT_SECRET.
PASSKEY_ORIGIN(для passkey-режима)CODEX_REMOTE_WEB_JWT_SECRETCODEX_REMOTE_ANCHOR_JWT_SECRET(если нужен legacy flow)
AUTH_MODE=passkey|basicCODEX_REMOTE_WEB_JWT_SECRETDEVICE_VERIFICATION_URLCORS_ORIGINS- дополнительно для passkey:
PASSKEY_ORIGIN,PASSKEY_RP_ID
ANCHOR_ORBIT_URLAUTH_URL- опционально
CODEX_REMOTE_ANCHOR_JWT_SECRET(legacy) - опционально
ANCHOR_APP_CWD
Orbit unavailable: неверныйAUTH_URLили несовпадение origin (PASSKEY_ORIGIN/ CORS)401/403на/ws/clientили/ws/anchor: недействительный/просроченный токен- ошибки
Not initialized:codex app-serverне прошёлinitialize - неверные файлы проекта: неправильно задан
ANCHOR_APP_CWD
- токены в query string (
?token=) могут попадать в логи - при хранении токенов в
localStorageбезопасность устройства пользователя критична - серверная ротация refresh токенов и
logoutнужны для отзыва сессий