跳到主要内容

dsh-oauth

已验证

dsh-oauth · v0.2.0 · MIT · Web 界面

Provider-neutral OAuth account and credential lifecycle foundation for DeepSeek Harness

安装

dsh plugin add dsh-oauth

dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南

源码

标签

说明文档

dsh-oauth

English | 简体中文

dsh-oauth 是 DeepSeek Harness 的提供方中立 OAuth 基座。它不内置 OpenAI、ChatGPT、Codex 或任何其他厂商协议,而是给独立提供方插件一套稳定的账号与凭据生命周期。

提供方插件                dsh-oauth                    DeepSeek Harness
端点、client、scope  ->  登录会话与挑战  ->  ctx.credentials / 设置页 / Typert Remote
刷新、撤销、账号解析       并发刷新与账号索引
模型适配器                 不参与模型请求

基座负责什么

  • 注册和卸载 OAuth 提供方驱动。
  • 管理浏览器链接、设备码、一次性输入、取消和超时。
  • 将 OAuth 凭据存入 DSH 的 ctx.credentials,Remote 和 Web 界面从不返回令牌。
  • 原子维护不含机密的账号索引,并按账号串行执行跨进程 token refresh。
  • 向 Host 侧适配器提供 getCredential()getAccessToken()
  • 在宿主模型页的提供方添加区域保留“登录账号”兼容入口,并在 dsh-model-manager 的独立“模型中心”中提供同一套 OAuth 登录和账号配置。两处入口都复用同一个提供方中立的登录流程。

基座不负责什么

  • 不声明 OAuth endpoint、client ID、scope 或厂商附加参数。
  • 不实现 OpenAI、Codex、Claude、Google 等具体登录协议。
  • 不注册模型目录,不实现 LLM adapter,不代理模型请求。
  • 不创建或修改模型提供方配置;登录成功后由具体提供方插件向 OAuth 子槽注册配置条目,并自行维护模型路由。独立模型中心是后续演进入口,宿主原模型页目前继续保留。
  • 不把第三方订阅自动解释为通用 API 权限;可用模型和服务条款由提供方插件与第三方服务决定。

提供方插件接入

import type { Context } from '@deepseek-ai/cordis'
import type {} from 'dsh-oauth'
import type { OAuthProviderDriver } from 'dsh-oauth/types'

const driver: OAuthProviderDriver = {
  id: 'example',
  displayName: 'Example Account',
  authorizationTimeoutMs: 900000,
  async authorize(interaction, signal) {
    interaction.publish({ kind: 'browser', url: 'https://example.test/oauth/authorize' })
    // 提供方插件完成 PKCE、回调、token exchange 和账号解析。
    return {
      account: { id: 'stable-account-id', displayName: 'Example User' },
      credential: { schemaVersion: 1, accessToken: '...', refreshToken: '...' },
    }
  },
  async refresh(credential, signal) {
    return { credential }
  },
}

export function apply(ctx: Context): void {
  ctx.effect(() => ctx.oauth.registerProvider(driver), 'example-oauth-provider')
}

export const inject = ['oauth']

提供方可以用 authorizationTimeoutMs 声明自身授权流程所需的超时;未声明时使用基座的 loginTimeoutMs。这让设备码等长流程可以独立设置时限,而不在基座中加入厂商分支。

完整约定见 提供方驱动指南架构设计

安装

当前仓库只交付基座,没有真实提供方。安装基座后还需要安装至少一个依赖 dsh-oauth 的提供方插件:

dsh plugin --profile web add ./dsh-oauth-0.1.1.tgz
dsh web

配置

- id: dsh-oauth
  name: dsh-oauth
  config:
    loginTimeoutMs: 600000
    sessionRetentionMs: 1800000
    refreshBeforeMs: 300000

可选的 dshHomemetadataPath 用于覆盖账号索引位置。默认索引位于 $DSH_HOME/oauth/accounts.json;文件只包含提供方 ID、账号显示信息、凭据引用和时间戳,不包含 access token 或 refresh token。

浏览器状态持久化

  • 普通字段:提供方搜索词写入 dsh.oauth.settings.global.search.v1
  • 临时字段:设备码、验证码、密码和登录会话不写入 localStorage
  • 机密字段:Web 界面不持有 OAuth 凭据,因此没有浏览器端机密持久化。

开发

pnpm install
pnpm run typecheck
pnpm test
pnpm run build
pnpm run pack:check

社区调研

调研和自研决策见 OAuth 方案调研。已有项目可以作为具体提供方实现的参考,但它们都把 OpenAI/Codex 协议和模型适配绑在一起,不适合作为提供方中立基座的运行时依赖。

License

MIT