DeepSeek Harness Hub
← 返回列表

Access 远程授权Luawig/dsh-cloudflare-access

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

在远程主机名上再验证 Access JWT 并放行特权操作

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/12 · 已提供中文文档

DeepSeek Harness 的 Cloudflare Access JWT 验证与远程特权授权 # DeepSeek Harness 的 Cloudflare Access JWT 验证与远程特权授权 ## 概述 本文档描述 DeepSeek Harness 如何验证 Cloudflare Access JWT,以及如何通过远程特权授权来保护管理端点。 ## 架构 ``` ┌─────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ 客户端 │────▶│ Cloudflare │────▶│ DeepSeek │ │ │ │ Ac

综合分
29.5
GitHub 分
29.5
用户评分
★ Stars
0
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add Luawig/dsh-cloudflare-access
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-host-webserver
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-cloudflare-access

English

面向 DeepSeek Harness 的 Cloudflare Access JWT 再验证与远程 privileged 授权。

这是双面 Profile Bundle + Web Client 插件。它不替代 Cloudflare Access。身份仍在 Access。插件在 DSH Origin 再验证 Cf-Access-Jwt-Assertion,使 Settings、Credentials、Agent Preset 管理和模型发现可以在 https://dsh.example.com 这类远程主机名上工作。

不提供登录页、密码库、MFA、会话表或 Cloudflare API 客户端。

插件 2.0.x 对准 DeepSeek Harness 0.1.5-alpha.1。插件 1.0.x 是 DSH 0.1.2 之前那条线(live 验证于 0.1.1-rc.2)。在兼容性矩阵更新之前,不要默认其他 DSH 版本可用。

架构

插件运行在 DSH 进程内。它不替代 Cloudflare Access,也不替代 Origin 允许名单。

Deployment model

Internet → Cloudflare Access → Cloudflare Proxy
→ Origin allowlist → reverse proxy → DSH → this plugin

Web Client 只做 capability enablement(connection.isLoopback)。授权裁决留在 Origin 上的 Server。

Client vs Server

交互图(切换主题、Guided Views、导出 SVG/PNG):deployment、request path、client vs server、config。说明见 docs/diagrams.md。

快速开始

1. 使用 DeepSeek Harness Web profile。用 --trusted-host 钉住公网主机名。
2. 把该 Origin 放到 Cloudflare Access 应用后面。
3. 安装并重启:

dsh plugin --profile web add dsh-cloudflare-access

4. 锁定信任根(生产环境建议如此):

export DSH_CF_ACCESS_TEAM_DOMAIN=https://example.cloudflareaccess.com
export DSH_CF_ACCESS_AUDIENCES=your-access-application-aud

5. 经 Access 打开站点并硬刷新一次,再打开 Settings。Origin 上有效的 Cf-Access-Jwt-Assertion 会代替远程 Host 上的 DSH launch-token Cookie。loopback 仍须使用 dsh web 打印的 ?token= URL。

用 dsh --profile web --dump-config 确认 bundle:应有一层名为 dsh-cloudflare-access,以及插件行 id: cloudflare-access。

安全模型

远程 privileged 请求必须同时通过:

1. DSH 的 Host / Origin / sec-fetch-site 检查(--trusted-host 仍是必须的)。
2. 有效的 Cloudflare Access JWT(签名、iss、aud、过期时间;允许约 30 秒时钟偏差)。

有效 JWT 永远不能授权任意 Host 或 Origin。Loopback(localhost / 127.0.0.1 / ::1)不要求 JWT,因此 SSH Tunnel → localhost → DSH 仍然可用。v2.0 中远程 privileged API 始终要求 JWT。

Origin 应只对 Cloudflare(或等价入口)可达。安装本插件不是把 DSH 挂到公网的理由。详见 SECURITY.md。

Remote privileged request path

先做 Host/Origin。有效 JWT 不得把 Host 改写为 loopback。privileged 成功交给原 /api handler(DSH Remote);远程信任主机上有效 Access JWT 同时跳过 DSH launch-token Cookie。缺失或无效 JWT 返回 401/403,且不进入 privileged 业务实现。Loopback 不读 JWT,仍走官方 token/Cookie。

转发 Host、Origin 和 Cf-Access-Jwt-Assertion。不要剥掉 assertion 头。不要信任 CF_Authorization Cookie。

安装

需要 Web profile。包在 npm。

dsh plugin --profile web add dsh-cloudflare-access

未发布的 Git commit:

dsh plugin --profile web add github:Luawig/dsh-cloudflare-access

Git 树已包含预构建的 lib/index.js 和 lib/client.js。github: 安装使用这些产物,不需要 TypeScript 或 esbuild。

重启 DSH。不要手工编辑 $DSH_HOME/profiles/web/cordis.patch.yml,也不要改 DSH 本体。

卸载:

dsh plugin --profile web remove dsh-cloudflare-access

unload 后,本插件的 JWT 包装消失。若运行中的进程仍是旧 fiber,再重启一次。

配置

1. 把 DSH Web origin 放到 Cloudflare Access 应用后面。
2. 复制应用的 Audience(aud)和 team domain,例如 https://example.cloudflareaccess.com(省略 https:// 的主机名也可以)。
3. Cloudflare 会在已认证请求上注入 Cf-Access-Jwt-Assertion。该头是本插件读取的唯一身份。

team domain 规范化为 http(s) origin(路径丢弃)后,推导 issuer 与 JWKS URL:

issuer  =
JWKS    = /cdn-cgi/access/certs

不要配置 issuer 或 jwksUrl。支持多个 audience。

Configuration precedence

生产环境用环境变量钉住 team domain 和 audience。变量一旦存在(即使是空字符串),该字段即锁定,无法从远程 Settings 会话改指向。

| 变量 | 含义 |
| --- | --- |
| DSH_CF_ACCESS_TEAM_DOMAIN | Team domain / issuer |
| DSH_CF_ACCESS_AUDIENCES | 逗号分隔的 audience |
| DSH_CF_ACCESS_ORDINARY_MODE | off \| optional \| required |

dsh --profile web --trusted-host dsh.example.com

systemd:

[Service]
Environment=DSH_CF_ACCESS_TEAM_DOMAIN=https://example.cloudflareaccess.com
Environment=DSH_CF_ACCESS_AUDIENCES=your-access-application-aud
Environment=DSH_CF_ACCESS_ORDINARY_MODE=off
ExecStart=/usr/bin/dsh --profile web --trusted-host dsh.example.com

Cordis overlay(仅当对应 env 未设置时使用):

cloudflare:
teamDomain: https://example.cloudflareaccess.com
audiences:
- your-access-application-aud
auth:
ordinary: off

缺少 teamDomain 或 audiences:插件仍会启动,loopback 不变,远程 privileged API 被拒绝。

普通 API 模式

auth.ordinary 只作用于远程非特权 API,包括 /api/remote.mux。Loopback 忽略它。Host/Origin 始终先执行。

| 模式 | 无 JWT | 有效 JWT | 无效 JWT |
| --- | --- | --- | --- |
| off(默认) | DSH 原策略 | 忽略 | 忽略 |
| optional | DSH 原策略 | 放行 | 拒绝 |
| required | 拒绝 | 放行 | 拒绝 |

无论该设置如何,远程 privileged API 始终要求有效 JWT。

排障

| 现象 | 检查 |
| --- | --- |
| 远程 Settings 仍不可用 | Access 必须在站点前面;硬刷新,使 Client 模块在 Settings 之前加载;确认 Cf-Access-Jwt-Assertion 到达 Origin。 |
| Settings UI 从不调用 settings/describe | 本包设置了 dsh.client.immediately: true。若旧 tarball 漏了该项,重新安装。 |
| settings/ 返回 401 | Access header 缺失或未被转发。查反向代理是否转发 Cf-Access-Jwt-Assertion。loopback 仍须打开 dsh web 打印的 ?token= URL。 |
| settings/ 返回 403 | iss/aud/签名/过期无效、插件未配置、Host/Origin 不匹配,或 Origin 时钟偏差超过约 30 秒。 |
| ordinary=required 时事件 WebSocket 失败 | /api/remote.mux 走普通 API 策略。缺 JWT → 401;无效 JWT → 403。 |
| Loopback Settings 坏了 | 卸载插件;loopback 不得要求 JWT。若仍要求,请报 bug。 |
| JWKS / 密钥轮换失败 | Origin 必须能访问 https:///cdn-cgi/access/certs。Cloudflare 轮换密钥后无需改配置。 |
| 日志 | 只记录类别(expired、invalid_signature、issuer_mismatch、audience_mismatch、missing_token、jwks_unavailable、unconfigured)。从不记录 token。 |

本插件不授权 host.pickDirectory 或 host.openPath。部分 native-host UI 仍可能出现。

兼容性

| 插件 | DSH | 状态 |
| --- | --- | --- |
| 1.0.x | 0.1.1-rc.2(0.1.2 之前) | Live 验证(Web profile,远程 Settings / Credentials)。走 apiProxy + privileged pin。与 DSH 0.1.2+ 不兼容。 |
| 2.0.x | 0.1.5-alpha.1 | 已在 Cloudflare Access 后的 Web profile 上 live 验证(远程 Settings 不需要 DSH ?token=)。单元/集成测试。CI 不启动 DSH 进程。 |

在本矩阵更新之前,不要默认更新的 DSH 版本可用。

开发

pnpm install
pnpm test
pnpm typecheck
pnpm pack:check

改源码后执行 pnpm build,使提交的 lib/ 与 src/ 一致。CI 会重建 lib/,树不一致则失败。

dsh plugin --profile web add ./

插件打包遵循 dsh.pub/develop-plugin.md。本仓库不声称已有 dsh.pub listing 或安全审计。

维护者

Dependabot 每周更新 npm 和 GitHub Actions。从 GitHub Actions 发布时,使用 npm publish --access public --provenance,并授予 id-token: write。v0.1.0 和 v1.0.0 发布时没有 provenance。

License

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群