前言¶
在 DeepSeek Harness(DSH)里让智能体读 issue、查仓库、改文件,通常绕不开 GitHub API 和 access token。自己把 token 写进环境变量或配置文件,轮换和多人协作都麻烦;直接在对话里粘贴 token 也不合适。社区维护者 MFCJ45681 的 github-oauth-plugin(npm 包名 @local/github-oauth,版本 1.0.0,MIT)走 authorization code + 网页回调 的 GitHub OAuth,把 client_secret 与 token AES-256-GCM 加密后写入本机 vault,并同时提供对话内 github_* 工具、右侧栏面板和 设置 → GitHub 页面。下面介绍它是什么、怎么装、怎么用。
这是什么¶
一句话:DSH 的 联网工具 类插件,用同源路由 /plugins/github-oauth/* 完成 OAuth,凭据与仓库偏好进加密库,Agent 通过 15 个 github_* 原生工具调用 GitHub REST API。
- 维护者:MFCJ45681
- 目录页:https://www.skillhub.cn/plugins/MFCJ45681/github-oauth-plugin
- 源码:https://github.com/MFCJ45681/github-oauth-plugin
插件自带内置默认 OAuth App(lib/default-app.js),装好即可登录,不必先去 GitHub 创建应用;也可随时换成自己的 OAuth App。
核心功能¶
OAuth 与界面¶
- 授权流程:生成一次性 state,浏览器在 GitHub 授权页点同意,回调
/plugins/github-oauth/callback换 code 并加密存 token。 - 右侧栏 GitHub 面板:登录状态、仓库速览;未连接时可通过面板登录。
- 设置 → GitHub:更换 OAuth App、切换/移除账户、管理默认仓库与固定仓库。
- 输入框下方账户按钮(紧挨权限管理):默认只显示头像,点击展开多账户列表并一键切换;偏好在加密 vault 内,与凭据一并管理。
加密凭据库¶
| 项目 | 做法 |
|---|---|
| 算法 | AES-256-GCM(node:crypto),每条记录随机 12 字节 IV |
| 主密钥 | <DSH_HOME>/github-oauth/master.key,或环境变量 GITHUB_OAUTH_MASTER_KEY(经 scrypt 派生) |
| 数据文件 | <DSH_HOME>/github-oauth/vault.json(AEAD 信封,权限 0600,原子写) |
| 覆盖范围 | client_secret、access/refresh token、账号信息、仓库偏好;对外只暴露 clientIdMasked,不回显 secret 与 token |
GITHUB_OAUTH_DATA_DIR 可覆盖数据目录。解密失败会抛 E_VAULT_DECRYPT,提示主密钥不匹配或文件被篡改。
Agent 工具(15 个)¶
对话内可调用的工具包括:github_auth_status、github_auth_setup、github_auth_start、github_auth_logout、github_accounts、github_account_switch、github_account_remove、github_api_request、github_repo、github_issues、github_pulls、github_search、github_file、github_create_issue、github_preferences。
github_repo、github_issues、github_pulls、github_file、github_create_issue 的 repo 可省略,此时使用设置里的默认仓库;未设置则返回 E_NO_REPO。github_repo 等默认会在结果后追加「仓库上下文」(元数据、顶层文件树、README 摘要),传 withContext: false 可关闭。
所有工具返回统一信封(ok / code / text / data 等);失败为 ok: false 并带中文提示,不中断多工具回合。
默认 OAuth 权限(scopes)¶
插件请求:repo read:user user:email。如需更小权限,需改 lib/oauth.js 的 DEFAULT_SCOPE 后重装。
安装与启用¶
推荐用 DSH 官方插件命令(等同插件市场安装方式):
dsh plugin --profile web add github:MFCJ45681/github-oauth-plugin
# 然后重启 DSH(正在运行的进程不会重新加载 bundle)
离线等价方式(资料中的源码安装脚本,非 git clone 流程描述):
DSH_PROFILE_DIR=/root/projects/.dsh/profiles/web ./install.sh
dsh plugin add 会通过 pnpm 安装到 <profile>/node_modules/@local/github-oauth 并写入 dsh.profile.bundles。卸载可用 dsh plugin --profile web remove @local/github-oauth,或仓库内 ./uninstall.sh [--purge](--purge 同时删除加密凭据库)。
运行环境:package.json 要求 Node >=20;客户端注入面向 web profile(cordis.patch.yml 补丁 bundle)。
安装后必须重启 DSH,否则 bundle 不会加载。
典型用法¶
第一次登录(推荐路径)¶
- 右侧栏
+→ GitHub →「使用 GitHub 登录」,在 GitHub 页授权一次即可。 - 若浏览器通过局域网 IP 访问 DSH,需确认回调地址与 DSH 对外 URL 一致;可用工具
github_auth_start({ publicUrl: "http://<ip>:3080" })或按面板提示操作。
换成自己的 OAuth App(可选)¶
- 打开 https://github.com/settings/developers → New OAuth App
- Homepage URL:你的 DSH 地址(例如http://127.0.0.1:3080)
- Authorization callback URL:http://127.0.0.1:3080/plugins/github-oauth/callback - 在 设置 → GitHub → OAuth App → 使用自定义 OAuth App 填写 Client ID / Client Secret,保存即生效;或由 Agent 调用:
github_auth_setup({ "clientId": "...", "clientSecret": "..." })
CLI 等价:
node scripts/configure.js set --client-id Iv1.xxxxxxxx --client-secret-stdin
切回内置应用:github_auth_setup({ useDefault: true }) 或 node scripts/configure.js use-default。
多账户¶
composer 下拉「添加其他账户…」或面板登录走同一 OAuth 流程;在输入框账户按钮或 设置 → GitHub 切换 @login,已保存 token 无需重新授权。移除账户可用设置页或 github_account_remove({ login })。
在对话里查仓库¶
配置默认仓库后,Agent 可直接调用例如 github_issues、github_file 而省略 repo;任意 REST 可用 github_api_request。
适用场景与注意¶
适合:在 DSH web profile 里做 issue/PR 协作、读仓库文件、搜索代码,并希望 token 留在本机加密库而非明文配置里的开发者。
注意:
- 插件以当前 DSH 进程权限运行,HTTP 路由
/plugins/github-oauth/*为同源本机服务;安装前应阅读源码与 MIT 许可证,自行评估信任边界。 - 内置 OAuth App 的 client secret 随插件分发,资料中说明其相当于公开信息;真正权限来自你在授权页的同意。敏感环境建议改用自有 OAuth App。
- SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系;本文事实以仓库 README 与
package.json为准。
结尾¶
github-oauth-plugin 把 GitHub OAuth、AES-256-GCM 凭据库、15 个 github_* 工具、右侧栏与设置页收进一个 DSH bundle,默认应用即可登录,也支持自定义 OAuth App 与多账户切换。
- 目录页:https://www.skillhub.cn/plugins/MFCJ45681/github-oauth-plugin
- GitHub:https://github.com/MFCJ45681/github-oauth-plugin