본문으로 이동
문서 탐색인증과 OAuth
설정레퍼런스

인증과 OAuth

자격 소스, /login 뒤의 OAuth 프로파일, 선택적 자격 가져오기, API 키가 사는 곳을 다룹니다.

GEODE는 구독 경로와 PAYG API 키를 받습니다. 어느 쪽을 쓸지는 CredentialSource 하나로 표현됩니다. OpenAI 구독 프로파일과 플랜은 ~/.geode/auth.toml에, API 키는~/.geode/.env에 저장됩니다.

자격 소스

단일 SoT는 core/config/credential_source.pyCredentialSource StrEnum입니다.

의미
auto매니페스트 순서 해석. OAuth 우선, PAYG는 fallback_to_payg가 켜진 경우에만.
api_keyPAYG API 키.
claude-cli퇴역한 Anthropic 입력. migration 오류만 내며 실행되지 않습니다.
openai-codex프로세스 내부 codex-oauth 어댑터를 통한 ChatGPT 구독 OAuth.
oauthOpenAI는 Codex OAuth 별칭, Anthropic은 퇴역 오류 입력.
none해당 프로바이더 비활성 센티널.

Anthropic과 OpenRouter의 내장 경로는 api_key뿐입니다. 과거claude-cli/oauth 값은 migration 안내를 위해 읽지만 binary나 네트워크 호출 전에 중단됩니다.

선택은 [llm] anthropic_credential_source /openai_credential_source(기본 auto)에 저장됩니다. /login source <provider> <type>은 toml에만 쓰므로 .env를 지워도 선택이 살아남습니다. (provider, source) 쌍마다 구체 어댑터가 하나씩 레지스트리에 등록됩니다(core/llm/adapters/anthropic_payg, openai_payg,codex_oauth,openrouter_payg,glm_coding_plan, glm_payg).

/login 대시보드

세션 안의 /login은 플랜과 자격을 한 화면에서 관리합니다(core/cli/commands/login.py). thin CLI에서 로컬로 실행되고, 끝나면 데몬에 인증 상태 리로드를 알립니다.

서브커맨드동작
/login openaiChatGPT 구독 OAuth 로그인. device-code 플로우는 core/auth/oauth_login.py이고, 결과는 auth.toml에 OAUTH_BORROWED 플랜 + 프로파일 쌍으로 저장됩니다.
/login anthropicANTHROPIC_API_KEY를 등록하고 api_key 경로를 선택합니다.
/login googleGmail, Calendar, Drive, Docs, Sheets, Tasks, Contacts용 Google Workspace OAuth. 사용자가 만든 Desktop 앱 클라이언트를 가져오며 LLM 프로바이더 자격과 분리됩니다.
/login add자격 추가. 키 모양(sk-ant-, sk-proj-, sk-or-v1-, GLM {id}.{secret})으로 프로바이더를 추정합니다.
/login use / remove프로파일 선택과 제거.
/login route프로바이더와 플랜 라우팅 확인.
/login quota구독 쿼터 상태.
/login source <provider> <type>자격 소스 영속화. config.toml [llm]에 기록.

Google Workspace

uv나 GitHub에서 설치한 사용자도 중앙 GEODE OAuth 앱 없이 자신의 Google Cloud Desktop 클라이언트로 연결할 수 있습니다. 권장 진입점은/login google입니다. 첫 연결에서는 client JSON 경로와 필요한 서비스 번들을 명시적으로 고릅니다. 자동화하려면 다음처럼 한 줄로 지정할 수 있습니다. Google Cloud 콘솔부터 시작하는 절차는 Google Workspace 연결 가이드에 있습니다.

/login google --client-json ~/Downloads/client_secret.json \
  --services gmail-send,calendar-read,workspace-files

/login google services
/login google status
/login google use user@example.com
/login google --new-account --services calendar-read
/login google --services calendar-read --replace-services
/login google logout user@example.com

인증은 시스템 브라우저, 임의의 127.0.0.1 포트, Authorization Code + PKCE S256 + state 검증을 씁니다. Google이 Desktop 앱의 incremental auth를 지원하지 않으므로 서비스를 더할 때는 대상 활성 계정의 기존 번들과 새 번들의 합집합으로 재동의합니다. 브라우저에서 다른 계정을 고르면 저장하지 않고 실패하며, 두 번째 계정은 --new-account로 연결합니다. 권한을 줄일 때는 유지할 전체 번들과 --replace-services를 함께 지정합니다. gmail-read는 Restricted scope라 기본 권장 묶음에 포함되지 않습니다. Drive·Docs·Sheets는 non-sensitive drive.file로 GEODE가 만들거나 파일별로 허용된 항목만 다룹니다.

저장소내용
OS keyring
geode.google.oauth
refresh token, client secret, 계정 이메일과 표시 이름. 안전한 백엔드가 없으면 로그인은 실패하며 평문 fallback은 없습니다.
~/.geode/google/accounts.jsonschema version, 단조 증가 revision, 활성 account id, client/project id, 서비스 번들, 실제 granted scopes, 상태와 시각만. 프로세스 간 .accounts.lock 뒤 atomic write, 디렉터리 0700·파일 0600.
프로세스 메모리짧은 수명의 access token과 expiry. 데몬 auth reload와 logout 때 폐기.
세션 영속 저장소Workspace 도구의 원문 입력·결과는 JSON·SQLite·도구 로그에서 도구 이름을 담은 _personal_data_omitted 표식으로 치환하고, 바깥 호출 행만 call id를 유지합니다. 영속 telemetry에는 API 오류 상세를 복사하지 않고, 개인 도구가 포함된 batch는 별도 reflection provider 호출을 건너뜁니다. 별도의 회전형 런타임 로그에는 제한된 Google API 오류 진단이 남을 수 있습니다. 사용자가 직접 쓴 대화문과 모델이 대화문으로 작성한 요약은 일반 세션 보존 정책을 따릅니다.

Workspace 읽기 결과는 선택한 LLM 프로바이더로 전달될 수 있으므로 매 도구 호출 직전에 개인 데이터 disclosure와 affirmative consent가 뜹니다. 이 승인은 always-allow할 수 없고 headless·서브에이전트에서는 닫힌 채로 거부됩니다. Gmail 전송과 Drive/Docs/Sheets/Tasks/Calendar 변경도 같은 비캐시형 매 호출 승인을 거쳐 HITL 0·권한 건너뛰기로 우회할 수 없습니다. 자세한 스키마와 Hermes 비교는 설계 기록docs/architecture/google-workspace-oauth.md에 있습니다.

ChatGPT 자격 가져오기

기본 경로는 /login openai가 발급해~/.geode/auth.toml에 저장한 자격입니다. 기존~/.codex/auth.json도 읽을 수 있지만 이는 자격 가져오기일 뿐이며 GEODE는 Codex CLI를 추론에 실행하지 않습니다.

PAYG 키

API 키는 시크릿이므로 ~/.geode/.env 층에 삽니다. 온보딩과 /login의 키 기록이 이 계약을 따릅니다 (core/config/env_io.pyupsert_env).

# ~/.geode/.env
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-proj-...
OPENROUTER_API_KEY=sk-or-v1-...
ZAI_API_KEY={id}.{secret}

GLM은 엔드포인트가 둘입니다. Coding Plan(구독 과금)과 PAYG(종량 과금)이고, Coding Plan 키를 PAYG 경로에 쓰면 구독 쿼터를 조용히 우회해 종량 과금됩니다.

실패 모드

증상원인해법
응답이 비거나 401토큰 만료 또는 키 무효geode doctor로 자격 상태를 보고 /login으로 갱신합니다. Codex 쪽은 codex login을 다시 실행합니다.
소스를 바꿨는데 그대로구버전의 GEODE_*_CREDENTIAL_SOURCE env 줄이 마스크geode config explain anthropic_credential_source로 WINNER 층을 확인하고 그 줄을 지웁니다.
서브프로세스에서 AdapterNotFoundError어댑터 레지스트리는 프로세스 단위인데 부트스트랩 누락워커가 core.llm.adapters.registry.bootstrap_builtins()를 호출하는지 확인합니다.
구독이 있는데 PAYG로 과금auto가 OAuth를 못 찾고 키로 해석OpenAI는 /login route/login quota를 확인하고 openai-codex로 고정합니다. Anthropic은 api_key만 지원합니다.

다음