-
Notifications
You must be signed in to change notification settings - Fork 6.4k
[App-server] Add auth v2 doc & update codex mcp interface auth section #6353
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -13,3 +13,98 @@ Currently, you can dump a TypeScript version of the schema using `codex generate | |
| ``` | ||
| codex generate-ts --out DIR | ||
| ``` | ||
|
|
||
| ## Auth endpoints (v2) | ||
|
|
||
| The v2 JSON-RPC auth/account surface exposes request/response methods plus server-initiated notifications (no `id`). Use these to determine auth state, start or cancel logins, logout, and inspect ChatGPT rate limits. | ||
|
|
||
| ### Quick reference | ||
| - `account/read` — fetch current account info; optionally refresh tokens. | ||
| - `account/login/start` — begin login (`apiKey` or `chatgpt`). | ||
| - `account/login/completed` (notify) — emitted when a login attempt finishes (success or error). | ||
| - `account/login/cancel` — cancel a pending ChatGPT login by `loginId`. | ||
| - `account/logout` — sign out; triggers `account/updated`. | ||
| - `account/updated` (notify) — emitted whenever auth mode changes (`authMode`: `apikey`, `chatgpt`, or `null`). | ||
| - `account/rateLimits/read` — fetch ChatGPT rate limits; updates arrive via `account/rateLimits/updated` (notify). | ||
|
|
||
| ### 1) Check auth state | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should try to autogenerate more of this from code at some point.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. sg |
||
|
|
||
| Request: | ||
| ```json | ||
| { "method": "account/read", "id": 1, "params": { "refreshToken": false } } | ||
| ``` | ||
|
|
||
| Response examples: | ||
| ```json | ||
| { "id": 1, "result": { "account": null, "requiresOpenaiAuth": false } } // no auth needed | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I believe it's more accurate to say something like
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think it's not exactly this? it's more like set to false for oss? https://github.com/openai/codex/blob/main/codex-rs/core/src/model_provider_info.rs#L356. I'll update the comment to reflect this
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If a user is using a model provider that does auth via an API key that is read from an environment variable (which also includes how we support the Copilot API in the VS Code extension), then
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. interesting - looking at the code of how old get_auth_status workflow works it seems that we check requiresOpenaiAuth based on model provider, regardless of the auth method (api key or not): https://github.com/openai/codex/blob/main/codex-rs/app-server/src/codex_message_processor.rs#L820
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ah nice, i did get it completely wrong lol. thanks for clarifying! |
||
| { "id": 1, "result": { "account": null, "requiresOpenaiAuth": true } } // auth needed | ||
| { "id": 1, "result": { "account": { "type": "apiKey" }, "requiresOpenaiAuth": true } } | ||
| { "id": 1, "result": { "account": { "type": "chatgpt", "email": "[email protected]", "planType": "pro" }, "requiresOpenaiAuth": true } } | ||
| ``` | ||
|
|
||
| Field notes: | ||
| - `refreshToken` (bool): set `true` to force a token refresh. | ||
| - `requiresOpenaiAuth` reflects the active provider; when `false`, Codex can run without OpenAI credentials. | ||
|
|
||
| ### 2) Log in with an API key | ||
|
|
||
| 1. Send: | ||
| ```json | ||
| { "method": "account/login/start", "id": 2, "params": { "type": "apiKey", "apiKey": "sk-…" } } | ||
| ``` | ||
| 2. Expect: | ||
| ```json | ||
| { "id": 2, "result": { "type": "apiKey" } } | ||
| ``` | ||
| 3. Notifications: | ||
| ```json | ||
| { "method": "account/login/completed", "params": { "loginId": null, "success": true, "error": null } } | ||
| { "method": "account/updated", "params": { "authMode": "apikey" } } | ||
| ``` | ||
|
|
||
| ### 3) Log in with ChatGPT (browser flow) | ||
|
|
||
| 1. Start: | ||
| ```json | ||
| { "method": "account/login/start", "id": 3, "params": { "type": "chatgpt" } } | ||
| { "id": 3, "result": { "type": "chatgpt", "loginId": "<uuid>", "authUrl": "https://chatgpt.com/…&redirect_uri=http%3A%2F%2Flocalhost%3A<port>%2Fauth%2Fcallback" } } | ||
| ``` | ||
| 2. Open `authUrl` in a browser; the app-server hosts the local callback. | ||
| 3. Wait for notifications: | ||
| ```json | ||
| { "method": "account/login/completed", "params": { "loginId": "<uuid>", "success": true, "error": null } } | ||
| { "method": "account/updated", "params": { "authMode": "chatgpt" } } | ||
| ``` | ||
|
|
||
| ### 4) Cancel a ChatGPT login | ||
|
|
||
| ```json | ||
| { "method": "account/login/cancel", "id": 4, "params": { "loginId": "<uuid>" } } | ||
| { "method": "account/login/completed", "params": { "loginId": "<uuid>", "success": false, "error": "…" } } | ||
| ``` | ||
|
|
||
| ### 5) Logout | ||
|
|
||
| ```json | ||
| { "method": "account/logout", "id": 5 } | ||
| { "id": 5, "result": {} } | ||
| { "method": "account/updated", "params": { "authMode": null } } | ||
| ``` | ||
|
|
||
| ### 6) Rate limits (ChatGPT) | ||
|
|
||
| ```json | ||
| { "method": "account/rateLimits/read", "id": 6 } | ||
| { "id": 6, "result": { "rateLimits": { "primary": { "usedPercent": 25, "windowDurationMins": 15, "resetsAt": 1730947200 }, "secondary": null } } } | ||
| { "method": "account/rateLimits/updated", "params": { "rateLimits": { … } } } | ||
| ``` | ||
|
|
||
| Field notes: | ||
| - `usedPercent` is current usage within the OpenAI quota window. | ||
| - `windowDurationMins` is the quota window length. | ||
| - `resetsAt` is a Unix timestamp (seconds) for the next reset. | ||
|
|
||
| ### Dev notes | ||
|
|
||
| - `codex generate-ts --out <dir>` emits v2 typings under `v2/`. | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit: |
||
| - See [“Authentication and authorization” in the config docs](../../docs/config.md#authentication-and-authorization) for configuration knobs. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -21,7 +21,8 @@ At a glance: | |
| - `getUserSavedConfig`, `setDefaultModel`, `getUserAgent`, `userInfo` | ||
| - `model/list` → enumerate available models and reasoning options | ||
| - Auth | ||
| - `loginApiKey`, `loginChatGpt`, `cancelLoginChatGpt`, `logoutChatGpt`, `getAuthStatus` | ||
| - `account/read`, `account/login/start`, `account/login/cancel`, `account/logout`, `account/rateLimits/read` | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This doc merits a follow-up to be rewritten because it's very misleading:
|
||
| - notifications: `account/login/completed`, `account/updated`, `account/rateLimits/updated` | ||
| - Utilities | ||
| - `gitDiffToRemote`, `execOneOffCommand` | ||
| - Approvals (server → client requests) | ||
|
|
@@ -113,11 +114,7 @@ The client must reply with `{ decision: "allow" | "deny" }` for each request. | |
|
|
||
| ## Auth helpers | ||
|
|
||
| For ChatGPT or API‑key based auth flows, the server exposes helpers: | ||
|
|
||
| - `loginApiKey { apiKey }` | ||
| - `loginChatGpt` → returns `{ loginId, authUrl }`; browser completes flow; then `loginChatGptComplete` notification follows | ||
| - `cancelLoginChatGpt { loginId }`, `logoutChatGpt`, `getAuthStatus { includeToken?, refreshToken? }` | ||
| For the complete request/response shapes and flow examples, see the [“Auth endpoints (v2)” section in the app‑server README](../app-server/README.md#auth-endpoints-v2). | ||
|
|
||
| ## Example: start and send a message | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We don't have an
initialize?