READMESource: main@b66ba082
dsh-credential-panel
在 DSH 设置页加一张凭据面板:列出凭据库里的引用名与它们的状态,并允许新增、覆盖、删除。
它解决什么
DSH 的凭据服务由 harness 自带(@deepseek-ai/dsh-credentials-local,profile 里 id 为 credentials,默认落在 $DSH_HOME/.credentials.yaml)。设置页只在模型 provider 那一行画一个已配置/未配置的点 —— 插件自定义的引用名(如 QBT_API_KEY)没有任何界面入口,因为按契约引用那一半根本不可枚举。本面板把名字从存储文件的 refs: 段读出来,其余一切仍走服务。
安全模型
| 面 | 处置 |
|---|---|
| 值 | 从不离开宿主。读取只返回 describe() 的三件事:是否已配置、来源层、可否写 |
| 跨站请求 | 同源校验(sec-fetch-site 与 Origin 对 Host),不合规 403 |
| 写入 | 需要面板令牌。宿主不为插件路由做会话鉴权,所以写入默认失败关闭:没配令牌就一律拒绝,而不是放开 |
| 令牌比对 | 两边各取 SHA-256 摘要后 timingSafeEqual,不在比较路径上留明文 |
| 只读来源 | 被进程环境等只读层遮蔽的名字标为 read-only,服务会拒绝这类写入(返回 409) |
面板令牌本身也存在凭据库里,配置只写它的引用名,不写值。
安装
dsh plugin --profile web add @wuzhican/dsh-credential-panel
profile 未启用 dsh-hmr 时改动需重启 dsh web。
开启写入
先给面板令牌生成一个值并存进凭据库:
node -e 'console.log(require("crypto").randomBytes(24).toString("base64url"))'
把输出存成引用 DSH_CREDENTIAL_PANEL_TOKEN(在面板里新增该名字并粘贴,或写进 $DSH_HOME/.credentials.yaml 的 refs: 段)。之后在面板的“面板令牌”框里输入同一个值即可新增/删除。
换名字或改行为:
- insert:
- id: credential-panel
name: '@wuzhican/dsh-credential-panel'
config:
tokenRef: MY_PANEL_TOKEN
readOnly: true # 只给看,禁一切写入
已知边界
- 引用名列表来自存储文件的
refs:段,只取冒号前的键名,值文本在匹配时即丢弃。DSH 若改了该文件的布局,这里会跟着失效;此时读取仍走服务,写入仍受令牌约束,只是列表会空。 records(插件自持记录)用官方listRecords()枚举,只展示地址与类型。- 面板不做批量操作,一次一个引用名。
许可
MIT
No comments yet. Be the first to write one.