shuangyan-notebook/第五域 · Fifth Domain/⚒️ 铸渊·协作指令|GitHub ↔ Notion 桥接协议/🔑 铸渊指令|Google Drive OAuth2 代理人重构 · Service Account ea304b59af9f473fbadfe1df1faee61e.md
Guanghu Domestic Migration a27e87cb99 chore: import sanitized domestic snapshot for REPO-007
Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc

[SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
2026-07-17 15:59:55 +08:00

11 KiB
Raw Blame History

belongs_to
belongs_to
INDEX · 铸渊·协作指令GitHub ↔ Notion 桥接协议

🔑 铸渊指令Google Drive OAuth2 代理人重构 · Service Account→OAuth2 全量替换 + 天眼全局扫描验收ZY-OAUTH2-REBUILD-2026-0324-001



🎯 指令背景

核心矛盾

此前 Google Drive 镜像桥接层ZY-DRIVE-BRIDGE-2026-0323-001设计采用 Service Account机器人模式 连接 Google Drive。经实测发现

解决方案

主控已完成 OAuth 2.0 代理人授权,即:让铸渊以「主控冰朔的代理人」身份直接操作 2TB 空间。


📋 铸渊执行任务清单

Phase 1 · 清理旧 Service Account 残留

  1. 删除旧 Secret:如果仓库中仍有 GOOGLE_DRIVE_SERVICE_ACCOUNTGOOGLE_SERVICE_ACCOUNT_KEY 等旧 Secret标记废弃(不要直接删,先注释掉引用)
  2. 搜索全仓库grep -r "service_account" .github/ scripts/ —— 找出所有引用 Service Account 的代码
  3. 列出清单:把所有需要修改的文件路径列出来,作为 Phase 2 的输入

Phase 2 · OAuth2 代理人逻辑全量替换

核心变更:所有 Google Drive API 调用从 Service Account 认证切换到 OAuth2 认证。

2.1 认证模块重写

创建或重写 scripts/grid-db/drive-auth.js(统一认证入口):

/**
 * drive-auth.js
 * 
 * OAuth2 认证模块 · 替代原 Service Account 模式
 * 
 * 环境变量:
 *   GDRIVE_CLIENT_ID      — OAuth 客户端 ID
 *   GDRIVE_CLIENT_SECRET   — OAuth 客户端密钥
 *   GDRIVE_REFRESH_TOKEN   — 长效刷新令牌
 * 
 * 返回已认证的 google.drive 客户端实例
 */

const { google } = require('googleapis');

function getDriveClient() {
  const oauth2Client = new google.auth.OAuth2(
    process.env.GDRIVE_CLIENT_ID,
    process.env.GDRIVE_CLIENT_SECRET
  );
  
  oauth2Client.setCredentials({
    refresh_token: process.env.GDRIVE_REFRESH_TOKEN
  });
  
  return google.drive({ version: 'v3', auth: oauth2Client });
}

module.exports = { getDriveClient };

2.2 同步脚本重写

修改 scripts/grid-db/sync-to-drive.js仓库→Drive 同步):

  • 删除所有 service_account / ServiceAccountCredentials 相关代码
  • 改为 const { getDriveClient } = require('./drive-auth');
  • 确保文件上传使用 OAuth2 客户端

2.3 Workflow YAML 更新

修改所有涉及 Drive 同步的 .github/workflows/*.yml

旧(废弃):

env:
  GOOGLE_DRIVE_SERVICE_ACCOUNT: $ secrets.GOOGLE_DRIVE_SERVICE_ACCOUNT 

OAuth2

env:
  GDRIVE_CLIENT_ID: $ secrets.GDRIVE_CLIENT_ID 
  GDRIVE_CLIENT_SECRET: $ secrets.GDRIVE_CLIENT_SECRET 
  GDRIVE_REFRESH_TOKEN: $ secrets.GDRIVE_REFRESH_TOKEN 

需要检查并更新的 Workflow 文件(至少包括):

  • sync-griddb-to-drive.ymlGrid-DB → Drive 镜像同步)
  • auto-deploy-drive-bridge.yml(一键部署 Drive 桥接层)
  • 所有引用 GOOGLE_DRIVE_SERVICE_ACCOUNTGOOGLE_SERVICE_ACCOUNT_KEY 的 workflow
  • grid-db-buffer-flush.yml(写缓冲层刷新,如涉及 Drive sync 步骤)

2.4 rclone 配置更新(如使用 rclone

如果仓库中有 rclone 配置,更新为 OAuth2 模式:

[gdrive]
type = drive
client_id = 从环境变量读取
client_secret = 从环境变量读取
token = {"access_token":"","token_type":"Bearer","refresh_token":"从环境变量读取","expiry":"2000-01-01T00:00:00Z"}
root_folder_id = 光湖格点库文件夹ID

Phase 3 · 端到端验证

完成 Phase 2 所有代码修改后,先不要提交,按以下顺序验证:

  1. 认证测试:运行 drive-auth.js,确认能获取有效的 access_token
  2. 写入测试:向 Drive 上传一个测试文件 test-oauth2-{timestamp}.json
  3. 读取测试:列出 Drive 目录,确认能看到测试文件
  4. 删除测试文件:清理测试残留
  5. 同步测试:模拟触发一次 sync-to-drive.js,确认 grid-db/ 数据能正常镜像到 Drive

Phase 4 · 🦅 天眼全局扫描(必须执行)

天眼扫描清单:

  1. Secrets 完整性扫描
    • GDRIVE_CLIENT_ID 存在且非空
    • GDRIVE_CLIENT_SECRET 存在且非空
    • GDRIVE_REFRESH_TOKEN 存在且非空
    • GOOGLE_DRIVE_SERVICE_ACCOUNT 不再被任何 workflow 引用
    • GOOGLE_SERVICE_ACCOUNT_KEY 不再被任何 workflow 引用
  2. 代码残留扫描
    • grep -r "service_account" .github/ scripts/ --include="*.js" --include="*.yml" --include="*.yaml" → 结果应为空
    • grep -r "ServiceAccountCredentials" .github/ scripts/ → 结果应为空
    • grep -r "GOOGLE_DRIVE_SERVICE_ACCOUNT" .github/ → 结果应为空
    • grep -r "GOOGLE_SERVICE_ACCOUNT_KEY" .github/ → 结果应为空
  3. OAuth2 配置一致性扫描
    • 所有 Drive 相关 workflow 均引用 GDRIVE_CLIENT_ID / GDRIVE_CLIENT_SECRET / GDRIVE_REFRESH_TOKEN
    • 所有 Drive 相关 JS 脚本均通过 drive-auth.js 获取客户端(统一入口,不允许各脚本自建认证)
  4. Workflow 链路完整性扫描
    • 所有 Drive 相关 workflow 能正常被触发paths 配置正确)
    • 没有 workflow 因缺少环境变量而报错
    • [skip ci] 防循环触发标记仍然存在
  5. 数据主权扫描
    • OAuth2 令牌只用于写入 光湖格点库/mirror/光湖格点库/inbox/ 目录
    • 没有任何代码试图访问用户 Drive 中「光湖格点库」以外的内容
    • 数据流向原则不变:仓库 = 权威源Drive = 只读镜像
  6. 安全扫描
    • 没有任何地方硬编码 Client ID / Client Secret / Refresh Token
    • 所有凭据均通过 process.env 读取
    • 日志输出中不会打印凭据内容

Phase 5 · 提交

天眼扫描全部通过后:

git add -A
git commit -m "refactor: OAuth2 代理人重构 · Service Account→OAuth2 全量替换 · ZY-OAUTH2-REBUILD-2026-0324-001 [skip ci]"
git push

提交后再触发一次完整的 CI/CD 流程,确认没有报错。


⚠️ Token 过期预警


📝 执行回执区

铸渊完成每个 Phase 后,在此处追加回执:

Phase 状态 完成时间 备注 / Commit SHA
Phase 1 · 清理旧残留 待执行
Phase 2 · OAuth2 全量替换 待执行
Phase 3 · 端到端验证 待执行
Phase 4 · 天眼全局扫描 待执行
Phase 5 · 提交 待执行

👤 人类手动操作区

已完成

  1. Google Cloud 项目创建guanghu-drive-bridge 已创建
  2. OAuth 2.0 客户端凭据生成 — Client ID + Client Secret 已获取
  3. OAuth 授权流程 — 已通过浏览器完成授权Refresh Token 已获取
  4. GitHub Secrets 注入GDRIVE_CLIENT_ID / GDRIVE_CLIENT_SECRET / GDRIVE_REFRESH_TOKEN 三个 Secret 已添加到仓库

待完成(非紧急,建议一周内操作)

  1. 发布 OAuth 应用(解除 7 天 Token 过期限制)
    • 路径Google Cloud Console → API和服务 → OAuth 权限请求页面 → 点「发布应用」
    • 或:将权限范围改为 drive.file 后发布(无需审核)
    • 完成后 Refresh Token 永久有效,不再需要每周重新授权
  2. Token 续期(如未发布应用,每 7 天需操作一次)
    • 重新访问授权链接 → 拿新 code → 在 Colab 运行换 token 脚本 → 更新 GitHub Secret GDRIVE_REFRESH_TOKEN

⚖️ 签发声明

本指令由 霜砚PER-SY001TCS-0002∞ 冰朔 签发。

本指令的核心目标只有一个:把 Google Drive 存储链路彻底打通。

铸渊接收后按 Phase 1 → 2 → 3 → 4 → 5 严格顺序执行。

Phase 4 天眼扫描未通过之前,禁止执行 Phase 5 提交。

每个 Phase 完成后在回执区写状态。

🖋️ 霜砚 · PER-SY001

🧊 代 TCS-0002∞ 冰朔 签发

📅 2026-03-24T14:45+08:00