Skip to content

Device-code logins need one consistent hint on every login surface #2529

Closed

Description

@lidge-jun

Area

Dashboard

What are you trying to accomplish?

Finish a device-code OAuth login (xAI, Claude, Kimi, Nous, GitHub Copilot) from the dashboard without guessing, and finish it from a machine that is not the one running the proxy.

What prevents this today?

The affordances a login needs are split across four surfaces, and no surface has all of them:

Surface Authorization URL Device / user code Paste redirect or code
Provider workspace panel yes yes no
Add-provider modal, OAuth pane yes no yes
Add-provider modal, Accounts tab no no no
Codex account modal yes no yes

Concretely:

  • gui/src/components/use-add-provider-oauth.ts types the login response as { url, instructions, error } and never reads deviceCode, although POST /api/oauth/login returns it.
  • gui/src/components/provider-workspace/ProviderAuthPanel.tsx renders the URL and the device code and has no paste field anywhere in the file, so a remote or SSH re-authentication on an existing provider has no way to submit a code.
  • One device provider does not set deviceCode at all and puts the user code inside a prose instructions string, so no surface can render it as a code widget.
  • LoginUrlBlock returns nothing when the URL is empty, so a device flow that returns only a code shows an empty box.

What should OpenCodex do?

Every surface that can start a login should show, when the provider supplies them: the user code with a copy button, the verification URL with a copy button, any provider instructions, and a field to paste a redirect URL or authorization code.

Example usage or interface

Start a Kimi login from the dashboard. Expected: the user code is displayed in a copyable widget and the verification URL is copyable, on whichever surface the login was started from. Today the code is only reachable by reading a sentence, and only on some surfaces.

Alternatives or workarounds

Reading the code out of the instructions sentence where it happens to be rendered, or starting the login from a different dialog than the one you wanted.

Additional context

The four surfaces drifted apart because each grew the half its own flow needed. Which affordances a user gets should be a property of the provider's flow, not of which dialog they happened to open.

Checks

  • I searched existing issues and documentation.
  • This request describes a concrete OpenCodex workflow rather than merely naming a desired technology.
  • I removed secrets and personal data.

Activity

  1. added
    account-poolOAuth, credentials, Codex pool, quota, failover, plans
    guiDashboard, tray, settings UI
    on Aug 25, 2026
  2. lidge-jun commented on Aug 25, 2026

    @lidge-jun
    OwnerAuthor

    리뷰 · 우선순위 59 / 80

    설명: 이 이슈는 기기 코드 로그인이 화면마다 다른 힌트를 보여주는 구멍을 고치자고 한다. 작성자는 lidge-jun 이다. 라벨은 enhancement, account-pool, gui 다. 지금 CURRENT dev HEAD 는 98ed186 이다. 방금 2492 가 클로드 계정 풀 카드 여백만 고쳤다. 로그인 힌트 네 화면은 그대로다. 구현 풀이 아직 없다. 이슈를 연다. 닫지 말 것. 라벨은 바꾸지 말 것.

    네 화면을 HEAD 에서 직접 읽었다. 제공자 작업공간 ProviderAuthPanel.tsx 387-402줄은 url 과 deviceCode 위젯이 있다. 붙여넣기 칸은 파일 안에 없다. 추가 제공자 모달 OAuth 칸 add-provider-oauth-pane.tsx 59-98줄은 LoginUrlBlock 과 붙여넣기가 있다. 기기 코드 위젯은 없다. use-add-provider-oauth.ts 53줄은 응답을 url, instructions, error 로만 읽는다. deviceCode 칸을 버린다. 추가 제공자 모달 계정 탭 ProviderCatalog.tsx 148-198줄은 로그인과 취소 버튼만 있다. url, 코드, 붙여넣기가 모두 없다. 코덱스 대기 add-codex-account-waiting-step.tsx 38-67줄은 url 과 붙여넣기가 있고 기기 코드는 없다. LoginUrlBlock 16줄은 url 이 비면 null 을 돌려서, 코드만 있는 흐름은 빈 상자가 된다.

    서버는 이미 deviceCode 를 돌려준다. oauth-account-routes.ts 158-176줄 startLoginFlow 결과가 url, instructions, deviceCode 로 나간다. 작업공간 쪽 use-providers-oauth.ts 93-95줄은 그 칸을 읽는다. 모달 쪽 훅만 안 읽는다. 제공자마다 onAuth 가 다르다. kimi.ts 212줄은 url 과 Enter code 문장만 넣고 deviceCode 칸이 없다. nous.ts 659-662줄과 github-copilot.ts 395-398줄은 deviceCode 에 userCode 를 넣는다. 그래서 작업공간 위젯은 누스와 깃허브만 코드를 보여주고, 키미는 문장 안에만 있다. xai.ts 169-173줄과 anthropic 로그인은 브라우저 리다이렉트와 붙여넣기 우회다. RFC 기기 코드가 아니다. 이슈가 둘을 한 바구니에 넣었다. 구현은 제공자 이름 목록이 아니라 deviceCode 가 있는지, 붙여넣기 우회가 있는지로 갈라야 한다.

    고치는 모양은 한 로그인 힌트 조각이 네 화면을 먹이는 것이다. 코드 복사, url 복사, 안내 문장, 붙여넣기 칸을 제공자가 준 것만 그린다. 1769 는 붙여넣기 우회 드래프트다. 그 풀로 이 이슈를 닫지 말 것. 1769 는 모달 붙여넣기만 보고, 기기 코드 위젯과 계정 탭은 비어 있다. 2221 네이티브 메인 토큰 갱신과도 다르다. 2497 드래프트를 이 이슈로 합치지 말 것. types.ts 와 config.ts 가르기와는 무관하다. 프리뷰 배포가 아니다. 2463 2464 2465 별칭 파일은 없다. 닫지 말 것.

    구현 풀이 오기 전에는 이 이슈만 연다. 계정 탭에서 키미를 누르면 코드가 안 보이고, 원격 재인증은 붙여넣을 곳이 없다. 재현은 대시보드에서 키미 또는 누스 로그인을 작업공간과 추가 모달과 계정 탭에서 각각 시작해 보면 된다. 내가 머지하지 않는다. 구현이 착지하기 전에 닫지 말 것.

    gui/src/components/use-add-provider-oauth.ts 53줄 - 로그인 응답에서 deviceCode 를 읽지 않아 모달이 코드를 받을 수 없다
    gui/src/components/add-provider-oauth-pane.tsx 59줄 - LoginUrlBlock 만 있고 기기 코드 위젯이 없다
    gui/src/components/provider-workspace/ProviderAuthPanel.tsx 387-402줄 - url 과 deviceCode 는 있고 붙여넣기 칸이 없어 원격 재인증이 막힌다
    gui/src/components/provider-catalog/ProviderCatalog.tsx 148-198줄 - 계정 탭은 버튼만 있고 url, 코드, 붙여넣기가 모두 없다
    gui/src/components/login-url-block.tsx 16줄 - url 이 비면 아무것도 안 그려 코드만 있는 흐름이 빈 상자가 된다
    src/oauth/kimi.ts 212줄 - onAuth 에 deviceCode 칸이 없고 코드를 문장에만 넣는다. 어떤 화면도 위젯으로 못 그린다

    메인테이너의 판단이 필요한 지점

    • 이 이슈를 지금 닫을지. 닫지 말 것. 구현이 없다
    • 1769 로 대신할지. 대신하지 말 것. 붙여넣기만 있고 코드 위젯과 계정 탭은 비어 있다
    • xAI 와 클로드를 기기 코드와 같은 조각으로 그릴지. 그 둘은 붙여넣기 우회다. deviceCode 유무로 갈라야 한다
    • 키미 onAuth 에 deviceCode 를 서버에서 먼저 넣을지. 넣는 편이 맞다. 화면만 고쳐도 키미는 위젯 값이 없다

    너의 추천
    이 이슈는 연다. 구현 풀을 기다린다. 한 힌트 조각이 네 화면을 먹이게 한다. 키미 onAuth 에 deviceCode 를 넣고, 모달 훅이 그 칸을 읽게 한다. 1769 로 닫지 말 것. 2221 도 연다. 내가 머지하지 않는다. 라벨은 그대로 둔다. 프리뷰 배포가 아니다.

    이 댓글은 grok-bot이 작성했습니다

  3. lidge-jun commented on Aug 25, 2026

    @lidge-jun
    OwnerAuthor

    Landed via #2530 at d7d708f

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    account-poolOAuth, credentials, Codex pool, quota, failover, plansenhancementNew feature or requestguiDashboard, tray, settings UIlanded-via-maintainerOriginal PR closed after landing via a maintainer merge train

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions