提供方专属认证
特定于提供商的认证
相关源文件
本章引用的主要源码文件:
crates/jcode-auth-types/Cargo.tomlcrates/jcode-auth-types/src/lib.rscrates/jcode-provider-metadata/src/lib.rssrc/auth/doctor.rssrc/auth/integration.rssrc/auth/lifecycle_driver.rssrc/auth/login_diagnostics.rssrc/auth/mod.rssrc/auth/refresh_state.rssrc/auth/status_types.rssrc/auth/tests.rssrc/auth/validation.rssrc/cli/auth_test.rssrc/cli/auth_test/choice.rssrc/cli/auth_test/probes.rssrc/cli/auth_test/run.rssrc/cli/auth_test/types.rssrc/cli/commands/report_info.rssrc/cli/login.rssrc/cli/login/scriptable.rssrc/cli/mod.rssrc/cli/output.rssrc/cli/provider_init.rssrc/cli/provider_init/external_auth.rssrc/cli/provider_init_tests.rssrc/config/config_file.rssrc/live_tests.rssrc/provider_catalog.rssrc/provider_catalog_tests.rssrc/tui/app/auth.rssrc/tui/app/auth_account_commands.rssrc/tui/app/auth_account_picker.rs
jcode 实现了一套复杂的凭证发现和认证系统,旨在无缝桥接原生 jcode 账户与现有的第三方 CLI 工具和 IDE 配置。该系统使用户能够利用来自 Claude Code、GitHub Copilot 和 Cursor 等工具的现有认证状态,而无需手动迁移令牌。
1. 认证架构
认证系统的核心是 AuthStatus 结构体,它提供了所有支持提供商凭证可用性和有效性的统一视图 src/auth/mod.rs:174-177。
1.1. 凭证瀑布逻辑
jcode 对大多数提供商使用"瀑布"发现策略。它通常按以下顺序检查来源:
- 原生 jcode 凭证:存储在
~/.jcode/auth.json或~/.jcode/openai-auth.json中src/auth/mod.rs:106-110。 - 外部工具发现:探测其他 AI 工具(例如 Claude Code、Cursor)的配置文件或 SQLite 数据库
src/cli/provider_init/external_auth.rs:1-10。 - 环境变量:标准密钥,如
ANTHROPIC_API_KEY、OPENAI_API_KEY或GITHUB_TOKENsrc/auth/mod.rs:83-87、src/auth/mod.rs:112-114。
1.2. 状态缓存
为了防止在 UI 渲染期间进行昂贵的磁盘 I/O 和子进程执行(如 sqlite3 调用),jcode 采用了两级缓存策略:
AUTH_STATUS_CACHE:一个全局的LazyLock<RwLock<Option<(AuthStatus, Instant)>>>,将完整的探测结果缓存 30 秒src/auth/mod.rs:45-50。COMMAND_EXISTS_CACHE:针对 CLI 工具存在性(例如cursor-agent)的进程级无限期缓存,以避免重复扫描PATHsrc/auth/mod.rs:56-58。
1.3. 身份与状态管理
任何单个提供商的认证状态由 AuthState 枚举表示 src/auth/mod.rs:33-36:
Available:凭证有效且可用src/auth/mod.rs:91-91。Expired:配置存在但令牌需要刷新src/auth/mod.rs:92-92。NotConfigured:未找到凭证src/auth/mod.rs:93-93。
来源:src/auth/mod.rs:1-121、src/provider_catalog.rs:1-40、src/config/config_file.rs:162-196
2. Anthropic 和 Claude 认证
jcode 支持多个 Anthropic 账户,并且可以从官方 claude CLI(Claude Code)继承身份。
2.1. 发现瀑布
系统使用优先级瀑布探测 Claude 凭证 src/auth/mod.rs:107-107:
- Claude Code:从
~/.claude/.credentials.json继承。 - OpenCode:从 OpenCode 认证路径继承。
- 原生 jcode:存储在
~/.jcode/auth.json中。
2.2. OAuth 流程
jcode 为 Claude 实现了可脚本化的 OAuth 流程 src/cli/login.rs:73-77。
- 机制:使用
verifier和redirect_uri的 PKCE(代码交换证明密钥)src/cli/login.rs:75-76。 - 生命周期:在登录过程中通过
PendingScriptableLogin::Claude变体进行处理src/cli/login.rs:73-77。
2.3. 多账户支持
系统使用标签管理不同的身份。TUI 中的 show_auth_status 命令会遍历这些提供商以显示详细的评估状态 src/tui/app/auth.rs:146-159。
数据流:Claude 认证发现
来源:src/auth/mod.rs:101-121、src/cli/login.rs:70-105、src/tui/app/auth.rs:134-164
3. OpenAI 和 Codex 认证
OpenAI 认证遵循类似的多账户结构,但侧重于 openai.env 或环境变量检测。
3.1. 发现
jcode 会在环境变量或特定的 openai.env 文件中检查 OPENAI_API_KEY src/auth/mod.rs:83-87。它还支持将 OpenCode 和 OpenCode Go 导入作为兼容 OpenAI 的配置文件 src/cli/provider_init.rs:47-50。
3.2. OAuth 实现
OpenAI OAuth 使用包含 verifier、state 和 redirect_uri 的可脚本化流程记录 src/cli/login.rs:78-83。这使得 jcode 能够通过本地回调或手动输入捕获授权码。
来源:src/auth/mod.rs:83-87、src/cli/login.rs:78-83、src/cli/provider_init.rs:189-215
4. Cursor 认证(SQLite 探测)
jcode 通过直接探测 Cursor IDE 的内部状态来支持"原生"Cursor 认证。
4.1. vscdb 探测
jcode 无需单独登录即可对 Cursor 的可用性执行快速探测 src/auth/mod.rs:117-117。这包括检查本地凭证文件或 cursor-agent CLI 的存在性 src/auth/mod.rs:197-203。
4.2. 实现细节
AuthStatus::check_fast 方法专为交互式 UI 界面(如 /account)设计,避免昂贵的子进程执行,同时仍能验证 Cursor 凭证是否存在于磁盘上 src/auth/mod.rs:197-203。
实体映射:Cursor 认证
来源:src/auth/mod.rs:117-117、src/auth/mod.rs:197-203、crates/jcode-provider-metadata/src/lib.rs:35-35
5. GitHub Copilot 认证
Copilot 认证利用了 VS Code/GitHub CLI 生态系统。
5.1. 令牌层级
jcode 使用快速探测检查 Copilot 凭证,该探测会查找现有的 GitHub 令牌 src/auth/mod.rs:162-172。
- 环境变量:
COPILOT_GITHUB_TOKEN、GH_TOKEN或GITHUB_TOKENsrc/auth/tests.rs:112-114。 - 验证:如果检测到验证失败,状态会被标记为
Expired以阻止自动使用src/auth/mod.rs:167-168。
5.2. 可脚本化流程
对于新登录,jcode 使用设备码流程 src/cli/login.rs:99-104:
user_code:显示给用户,用于在 GitHub 上手动输入。verification_uri:用户输入代码的 URL。interval:令牌交换的轮询间隔。
来源:src/auth/mod.rs:162-172、src/cli/login.rs:99-105、src/auth/tests.rs:112-114
6. 企业和云提供商
6.1. Google / Gemini
Google 认证同时支持官方 Gemini CLI 导入和原生 OAuth 流程。
- Gemini/Google OAuth:使用包含
verifier、state和redirect_uri的可脚本化流程记录src/cli/login.rs:84-98。 - Gmail 集成:支持特定的
GmailAccessTier(例如完整访问与只读访问)src/cli/login.rs:97-98。
6.2. Azure OpenAI(Entra ID)
Azure 认证同时支持 API 密钥和 Entra ID(原 Azure AD)。
- 瀑布:检查
AZURE_OPENAI_API_KEY和端点配置src/auth/mod.rs:110-112。 - Entra ID:通过
AuthStatus中的azure_uses_entra标志检测src/auth/mod.rs:112-112。
来源:src/auth/mod.rs:110-112、src/cli/login.rs:84-98、crates/jcode-provider-metadata/src/lib.rs:33-39