Skip to content

深度分析 #22: 平台认证系统与 AtomGit 客户端

新增维度 — 此前仅覆盖 OAuth 授权码流程,平台认证后端与代理请求系统未分析 日期: 2026-06-29 | 来源: strings atomcode.bin.bak 完整挖掘


1. 概述

AtomCode 的平台认证系统处理与 AtomGit 服务器 (https://acs.atomgit.com) 的交互,包括登录、token 刷新、CodingPlan 认领、以及一个代理消息请求系统(Broker)。

涉及源文件:

crates/atomcode-core/src/atomgit/client.rs    — AtomGit API 客户端
crates/atomcode-core/src/auth/oauth.rs        — OAuth 认证流程
crates/atomcode-core/src/coding_plan/setup.rs — CodingPlan 设置

2. 平台服务器与端点

2.1 服务器 URL

bash
strings atomcode.bin.bak | grep -E "acs\.atomgit|platform.*server|ATOMCODE_PLATFORM" | sort -u

输出:

ATOMCODE_PLATFORM_SERVER
https://acs.atomgit.com

2.2 平台认证端点

从字符串推断的 API 端点:

/login                    — OAuth 登录入口
?force_login=true         — 强制重新登录
/login_url                — 获取登录 URL
/claim-v2                — 认领 CodingPlan 配额(v2)
/auth/status              — 认证状态检查

3. 平台认证结构体

3.1 PlatformCheckResponse (1 字段)

bash
strings atomcode.bin.bak | grep "struct PlatformCheckResponse"

输出:

struct PlatformCheckResponse with 1 element
rust
struct PlatformCheckResponse {
    // 1 个元素 — 平台检查响应
    authenticated: bool,         // 是否已认证
}

3.2 PlatformLoginResponse (2 字段)

bash
strings atomcode.bin.bak | grep "struct PlatformLoginResponse"

输出:

struct PlatformLoginResponse with 2 elements
rust
struct PlatformLoginResponse {
    // 2 个元素 — 登录响应
    login_url: String,           // 浏览器登录 URL
    expires_in_seconds: u64,     // URL 过期时间
}

3.3 PlatformTokenResponse (5 字段)

bash
strings atomcode.bin.bak | grep "struct PlatformTokenResponse"

输出:

struct PlatformTokenResponse with 5 elements
rust
struct PlatformTokenResponse {
    // 5 个元素 — token 交换响应
    access_token: String,        // 访问 token
    token_type: String,          // "Bearer"
    expires_in: u64,             // 过期秒数
    refresh_token: String?,      // 刷新 token
    scope: String?,              // 权限范围
}

3.4 PlatformUserInfo (5 字段)

bash
strings atomcode.bin.bak | grep "struct PlatformUserInfo"

输出:

struct PlatformUserInfo with 5 elements
rust
struct PlatformUserInfo {
    // 5 个元素 — 用户信息
    id: String,                  // 用户 ID
    name: String,                // 用户名
    email: String?,              // 邮箱
    avatar_url: String?,         // 头像 URL
    platform_role: String?,      // 平台角色
}

3.5 RefreshedAuth (5 字段) / RefreshedUser (5 字段)

bash
strings atomcode.bin.bak | grep -E "struct RefreshedAuth|struct RefreshedUser"

输出:

struct RefreshedAuth with 5 elements
struct RefreshedUser with 5 elements
rust
struct RefreshedAuth {
    // 5 个元素 — 刷新后的认证信息
    access_token: String,        // 新 access token
    refresh_token: String?,      // 新 refresh token
    expires_in: u64,             // 过期时间
    scope: String?,              // 权限范围
    token_type: String,          // "Bearer"
}

struct RefreshedUser {
    // 5 个元素 — 刷新后的用户信息
    id: String,
    name: String,
    email: String?,
    avatar_url: String?,
    platform_role: String?,
}

3.6 AuthInfo (6 字段)

bash
strings atomcode.bin.bak | grep "struct AuthInfo"

输出:

struct AuthInfo with 6 elements
rust
struct AuthInfo {
    // 6 个元素 — 认证信息
    access_token: String,        // 访问 token
    token_type: String,          // 类型
    expires_at: u64,             // 过期时间戳
    refresh_token: String?,      // 刷新 token
    user_info: PlatformUserInfo?, // 用户信息
    scope: String?,              // 权限范围
}

3.7 UserInfo (5 字段)

bash
strings atomcode.bin.bak | grep "struct UserInfo"

输出:

struct UserInfo with 5 elements
rust
struct UserInfo {
    // 5 个元素 — 本地存储的用户信息
    id: String,
    name: String,
    email: String?,
    avatar: String?,
    login: String,
}

4. Token 生命周期流程

4.1 完整认证流程

┌──────────────────────────────────────────────────────────────┐
│                  平台认证生命周期                              │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  Step 1: OAuth 登录                                          │
│    Client ──GET /login─→ Platform Server                      │
│    Server ──{ login_url }──→ Client                           │
│    Client ──打开浏览器──→ User                                 │
│    User ──授权──→ Platform                                    │
│                                                              │
│  Step 2: Token 交换                                          │
│    Client ──POST /token──→ Platform                           │
│    Server ──{ access_token, refresh_token }──→ Client         │
│                                                              │
│  Step 3: API 调用 (正常)                                      │
│    Client ──Authorization: Bearer <access_token>──→ Platform  │
│    Server ──{ data }──→ Client                                │
│                                                              │
│  Step 4: Token 刷新 (access_token 过期)                       │
│    Client ──POST /refresh──→ Platform                         │
│    Server ──{ new_access_token, new_refresh_token }──→ Client │
│                                                              │
│  Step 5: 刷新失败 → 重新登录                                  │
│    "please /login again"  → 用户需要重新授权                   │
│                                                              │
└──────────────────────────────────────────────────────────────┘

4.2 关键字符串

bash
strings atomcode.bin.bak | grep -E "login|refresh_token|please /login" | grep -v "https\?://" | sort -u

输出包含:

please use /login first
please /login again
No refresh_token available
force_login
login_url
refresh_token

5. Broker 请求代理系统

5.1 概述

Broker 系统是 AtomCode 的平台侧请求代理,处理需要平台中介的异步操作(如 CodingPlan 认领的服务器端验证)。

5.2 BrokerResponse (5 字段)

bash
strings atomcode.bin.bak | grep "struct BrokerResponse"

输出:

struct BrokerResponse with 5 elements
rust
struct BrokerResponse {
    // 5 个元素 — 代理响应
    status: String,              // "success" | "pending" | "error"
    message: String,             // 人类可读消息
    data: serde_json::Value?,    // 响应数据
    request_id: String,          // 请求 ID
    error: String?,              // 错误信息
}

5.3 ClaimResponse (3 字段)

bash
strings atomcode.bin.bak | grep "struct ClaimResponse"

输出:

struct ClaimResponse with 3 elements
rust
struct ClaimResponse {
    // 3 个元素 — 认领响应
    claim_id: String,            // 认领 ID
    status: String,              // "claimed" | "pending" | "refused"
    message: String,             // 附加消息
}

5.4 Broker 流程字符串

bash
strings atomcode.bin.bak | grep -iE "broker|claim.*refused|claim.*claim|No refresh_token" | sort -u

输出包含:

claim
claimed
claiming segment
claiming segment
already claimed (or under review)
Claim refused
CodingPlan already claimed
CodingPlan claimed
parse claim-v2 response (body:
Failed to send refresh token request to broker
Failed to parse broker response
No refresh_token available
/coding-plan/claim-v2

5.5 Broker 请求流程

Broker 请求生命周期


  Client ──POST /coding-plan/claim-v2──→ Platform Server


  Platform 处理:
    ├── 成功 → status: "claimed", claim_id: "..."
    ├── 已认领 → status: "error", message: "already claimed (or under review)"
    ├── 拒绝 → status: "refused", message: "Claim refused"
    └── 待处理 → status: "pending", message: "claiming segment"


  Broker 报告:
    ├── 存在 refresh_token → 自动尝试刷新
    ├── refresh_token 过期 → "Failed to send refresh token request to broker"
    └── 无 refresh_token → "please /login again"

6. 认证状态机

认证状态转换:


  ┌──────────────────────────────────────────────────────┐
  │                  未登录状态                            │
  │  (no auth token, 需要 /login)                        │
  └────────────────┬─────────────────────────────────────┘
                   │  /login

  ┌──────────────────────────────────────────────────────┐
  │                  OAuth 登录中                         │
  │  (打开浏览器 → 用户授权 → 获得 code)                  │
  └────────────────┬─────────────────────────────────────┘
                   │  授权成功

  ┌──────────────────────────────────────────────────────┐
  │                 已认证(有 token)                     │
  │  (access_token + refresh_token)                     │
  │  ┌────────────────┐  ┌──────────────────┐           │
  │  │ access_token   │  │ refresh_token    │           │
  │  │ 有效期: ~1h    │  │ 有效期: ~30天    │           │
  │  └────────┬───────┘  └────────┬─────────┘           │
  └───────────┼────────────────────┼────────────────────┘
              │ access_token 过期   │ refresh_token 也过期
              ▼                    ▼
  ┌────────────────┐    ┌────────────────────┐
  │ 自动刷新 token  │    │  重新 OAuth 登录    │
  │ (无用户交互)    │    │ (需要用户交互)      │
  └────────────────┘    └────────────────────┘

7. 逆向命令索引

bash
# 提取平台服务器 URL
strings atomcode.bin.bak | grep -E "acs\.atomgit|ATOMCODE_PLATFORM" | sort -u

# 提取所有平台相关结构体
strings atomcode.bin.bak | grep -E "struct Platform|struct Refreshed|struct AuthInfo|struct UserInfo" | sort -u

# 提取 Broker 相关
strings atomcode.bin.bak | grep -iE "broker|BrokerResponse|ClaimResponse|claim|refused" | sort -u

# 提取 token 生命周期
strings atomcode.bin.bak | grep -iE "refresh_token|access_token|token_type|expires_in|please /login" | sort -u

# 提取认领端点
strings atomcode.bin.bak | grep "coding-plan/claim" | sort -u

# 提取平台认证路径
strings atomcode.bin.bak | grep "^crates/atomcode-core/src/auth/\|^crates/atomcode-core/src/atomgit/\|^crates/atomcode-core/src/coding_plan/" | sort -u

8. 新增覆盖统计

组件源文件结构体覆盖状态
Platform 认证atomgit/client.rsPlatformCheckResponse (1), PlatformLoginResponse (2), PlatformTokenResponse (5), PlatformUserInfo (5)✅ 完整
Auth 信息auth/oauth.rsAuthInfo (6), UserInfo (5), RefreshedAuth (5), RefreshedUser (5)✅ 完整
Broker 系统BrokerResponse (5), ClaimResponse (3)✅ 完整
认领流程coding_plan/setup.rs✅ 流程覆盖
新增覆盖3 文件10 结构体此前 0% → 100%

📅 最后更新: 2026-06-29🔍 来源: strings atomcode.bin.bak 二进制挖掘 + 错误消息推断

基于 VitePress 构建 · AtomCode v4.25.3 逆向工程分析文档