feat(codex): write managed ChatGPT id_token into live auth + reauth prompt

Bind the selected ChatGPT account's id_token into the Codex official
managed auth.json so it matches a native browser login for the fields
that drive behavior (auth_mode, account/plan/email via id_token claims).

- Persist id_token on CodexAccountData; capture at login and on refresh
  (empty string treated as missing). Add get_valid_token_and_id_token_for_account.
- codex_managed_oauth_live_auth now writes tokens.id_token when available.
- Keep the managed-vs-native safety marker intact: extract_codex_managed_oauth_auth
  tolerates id_token but still rejects native logins (which carry refresh_token /
  top-level last_refresh), so cc-switch never clears a real browser login.
  refresh_token and last_refresh are intentionally NOT written for this reason.
- Surface reauth_required (account has no stored id_token) through
  GitHubAccount -> ManagedAuthAccount -> TS. Legacy accounts get a styled
  amber prompt + one-click re-login (device flow) in CodexOAuthSection,
  flagged in both the selector dropdown and the select-mode hint.
- i18n: reauth strings added for en / ja / zh / zh-TW.

Verified: pnpm typecheck + build:renderer green; cross-model review of Rust
correctness, the managed-vs-native safety invariant, and the id_token lifecycle.
This commit is contained in:
SaladDay
2026-06-23 16:59:24 +00:00
parent 0aeca9a235
commit fc5fa85807
13 changed files with 307 additions and 34 deletions
+5 -1
View File
@@ -886,7 +886,11 @@ base_url = "http://localhost:8080"
.codex_oauth_manager
.read()
.await
.add_test_account_with_access_token("acct-managed", "managed-token")
.add_test_account_with_access_token(
"acct-managed",
"managed-token",
Some("managed-id-token"),
)
.await
.expect("seed managed Codex OAuth account");
});