OAuth · 账号管理
在插件页面和输入框旁管理 Grok 与 Codex 登录,不复制认证协议。
DeepSeek Harness 桌面端的官方 OAuth 设备登录、多账号切换与删除入口。
简体中文 · English
针对个人 DSH 桌面工作流的参考实现。插件详情页管理 Grok 与 Codex 的登录账号,输入框下方继续显示当前提供方状态;授权由官方已注册的 flow 完成,token 只留在 Host。请先核对自己的 DSH 版本与提供方权限,不直接照搬个人配置。
核心能力
| 🔑 官方设备登录 插件页展示账号与登录按钮;设备码由官方 flow 处理,不自行重写轮询或 PKCE。 |
🔄 多账号与模型联动 添加账号时先归档当前凭据;没有对应账号的平台不会进入会话模型目录或模型切换入口。 |
🧭 会话感知状态 跟随官方模型投影,切换会话/模型清除旧账号,不为读历史恢复 Agent。 |
| 🧩 补齐缺失路由 沿用官方模型目录,保留已有列表和配置,用版本号处理并发修改。 |
🛡 Host 内凭据 不把 token 写入 Client 或对话,也不读取其他 CLI 的 auth.json。 |
🧾 明确操作结果 区分本地退出与远端吊销失败;凭据成功保存不冒充路由配置也成功。 |
工作方式
使用官方 authorization.begin({key, method: "oauth", interaction, signal}),由 llm-pi-ai flow 负责设备码、轮询、PKCE、期限及提交。当前账号仍写入官方凭据键;其他账号保存为本插件的授权记录,切换时把选中记录写回对应官方键。正常续期由官方适配器负责,页面刷新时会同步当前账号的归档副本。
快速开始
需要官方 DSH 桌面版及对应 Grok / ChatGPT Codex 账号权限。原适配面向 Grok/SuperGrok/X Premium 与 ChatGPT Plus/Pro Codex;最终以官方接口实际接受的账号为准。
export DSH_HOME="${DSH_HOME:-$HOME/.dsh}"
git clone https://github.com/yueyexiayu/dsh-OAuth.git "$DSH_HOME/plugins/OAuth"
将下项合并到 $DSH_HOME/profiles/desktop/cordis.patch.yml,保留其他插件;OAuth 大小写一致:
- insert:
- id: OAuth
name: ../../plugins/OAuth/lib/index.js
⌘Q 完全退出 DSH 后重开,进入「插件 → 账号登录」页面管理 Codex 与 Grok 账号;输入框下方仍提供当前提供方的登录、换号、刷新与退出入口。按官方 notice 完成设备授权。不使用 CLI 插件管理改 desktop profile,不需要重建官方桌面包。
账号与配置
| 项目 | 行为 |
|---|---|
| 当前账号 | Host 的 $DSH_HOME/.credentials.yaml,键为 llm-pi-ai/xai、llm-pi-ai/openai-codex |
| 已保存账号 | oauth-accounts/grok-*、oauth-accounts/gpt-* 授权记录;界面只读取安全状态,不向 Client 返回 token |
| 支持平台 | 仅 Codex(openai-codex)与 Grok(xai) |
| 切换 | 先归档当前账号,再把选中账号写回对应官方凭据键 |
| 删除 | 删除当前或已保存账号,并尝试远端吊销;本地删除与远端失败分别报告 |
| 模型可见性 | 账号记录不存在时,llm.listModels 对 Codex/Grok 返回空列表;有账号时恢复原模型目录。使用 apiKeyEnv 的路由不受 OAuth 删除影响 |
| 会话选择 | 官方只读 sessionQuery.observeSession,modelSelection.next ?? lastUsed |
| 默认模型 | 仅无sessionId新入口,或已确认存在但无模型选择的空会话采用 |
| API Key 路由 | 明示退出 OAuth 不改变该认证,不擅自切换方式 |
| 路由补全 | 官方 settings.describe/mutate,保留已有路由/模型,版本冲突重查 |
- 添加账号、换号或退出先取消同凭据 key 的授权并等待官方
authorization/settled。卸载、取消和会话切换到其他提供方中止本插件发起的 flow;不保证任意忽略取消的第三方实现。 - 无效sessionId返回400,不存在404,模型/账号不匹配或已切换409。历史读取、格式、投影及持久化异常明确失败,不回落无关全球账号。
- Client 订阅模型投影,Host 异步完成后再次核对归属,旧请求不覆盖新状态。后台查询不清除操作错误。
- 刷新需合法 access token;缺少有效期采用官方默认,给出时须有限正数。省略 refresh token 保留旧值;字段存在但无效时拒绝并保留旧凭据。已完成轮换的有效凭据不会因后续配置失败或卸载丢弃。
- 远端不支持吊销时明确报失败;本地凭据仍删除,分别显示结果。不支持的交互prompt与授权/提交失败直接显示,不假装成功。
- 已知凭据在错误中脱敏,不声称识别任意未知 opaque token。不读取或改写
~/.grok/auth.json/~/.codex/auth.json,仓库不含账号凭据。
验证
cd "$DSH_HOME/plugins/OAuth"
for file in lib/*.js scripts/*.mjs test/*.mjs; do node --check "$file" || exit 1; done
node --test
可选官方组件验证:
DSH_OFFICIAL_NODE_MODULES=/absolute/path/to/official/node_modules node --test scripts/verify-official.mjs
自动测试使用合成数据和内存凭据队列,覆盖账号列表、登录归档、切换、删除、模型可见性门禁、平台限制和错误状态,不读写真实账号。本次在 DSH 0.2.2-rc.1 桌面运行中重启,确认插件页显示 v0.1.5,并验证删除账号后 Codex/Grok 模型组从会话模型选择器消失;未执行真实新增账号授权或远端吊销。
许可
MIT License。卸载只移除本插件的desktop加载项后完整重启;不要把删除插件当成已完成远端吊销。
No comments yet. Be the first to write one.