mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 16:30:57 +00:00
fix(auth): bootstrap codex cli credential without clobbering local (#71310)
* fix(auth): bootstrap codex cli credential without clobbering local readCodexCliCredentialsCached was imported but never registered in EXTERNAL_CLI_SYNC_PROVIDERS, so overlayExternalAuthProfiles could not seed openai-codex:default on fresh agents and runtime surfaced "No API key found for provider openai-codex" even after a successful codex login. Register the provider with a new bootstrapOnly flag. Providers flagged bootstrapOnly are adopted only to fill an empty slot: the overlay skips them when a local OAuth credential already exists for the profile, and readExternalCliBootstrapCredential returns null so the refresh path never replaces the locally stored canonical refresh token with stale CLI state. Minimax keeps its existing replace-on-expiry behavior. * test(auth): cover codex cli bootstrap --------- Co-authored-by: sudol <sudol@A8Max.localdomain> Co-authored-by: Peter Steinberger <steipete@gmail.com>
This commit is contained in:
@@ -44,9 +44,10 @@ To reduce that, OpenClaw treats `auth-profiles.json` as a **token sink**:
|
||||
|
||||
- the runtime reads credentials from **one place**
|
||||
- we can keep multiple profiles and route them deterministically
|
||||
- when credentials are reused from an external CLI like Codex CLI, OpenClaw
|
||||
mirrors them with provenance and re-reads that external source instead of
|
||||
rotating the refresh token itself
|
||||
- external CLI reuse is provider-specific: Codex CLI can bootstrap an empty
|
||||
`openai-codex:default` profile, but once OpenClaw has a local OAuth profile,
|
||||
the local refresh token is canonical; other integrations can remain
|
||||
externally managed and re-read their CLI auth store
|
||||
|
||||
## Storage (where tokens live)
|
||||
|
||||
@@ -128,8 +129,11 @@ At runtime:
|
||||
|
||||
- if `expires` is in the future → use the stored access token
|
||||
- if expired → refresh (under a file lock) and overwrite the stored credentials
|
||||
- exception: reused external CLI credentials stay externally managed; OpenClaw
|
||||
re-reads the CLI auth store and never spends the copied refresh token itself
|
||||
- exception: some external CLI credentials stay externally managed; OpenClaw
|
||||
re-reads those CLI auth stores instead of spending copied refresh tokens.
|
||||
Codex CLI bootstrap is intentionally narrower: it seeds an empty
|
||||
`openai-codex:default` profile, then OpenClaw-owned refreshes keep the local
|
||||
profile canonical.
|
||||
|
||||
The refresh flow is automatic; you generally don't need to manage tokens manually.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user