# dsh-fixed-token **Repository Path**: pi-lab/dsh-fixed-token ## Basic Information - **Project Name**: dsh-fixed-token - **Description**: deepseek harness - 使用固定的token - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-19 - **Last Updated**: 2026-10-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dsh-fixed-token 把 DeepSeek Harness Web GUI 每次启动随机生成的 `?token=` 固定下来。 ## 它做什么 `dsh web` 每个进程都会生成一个新的随机启动 token(`dsh-client-connection` 里的 `randomBytes(32)`)。这个 token 只用于首次把浏览器换成签名 cookie(默认 30 天有效)。但如果你收藏了带 token 的地址、在多台设备上打开,或写自动化脚本,token 每次重启都变就很麻烦。 本插件在 `client-connection` 挂载后,把 `connection.browserAuth.launchToken` 改写成固定值。启动打印的 URL、自动打开的浏览器,以及 `authorizeIndex` 的校验读的是同一个字段,所以三者始终一致。 不设置 token 时插件完全不动,行为和原生 `dsh web` 一致。 ## 局域网访问(替代 0.0.0.0) DSH 在两个地方明确拒绝通配地址: - `dsh-web-app` 的启动参数校验:`--host 0.0.0.0` 直接报错; - `dsh-host-webserver` 的配置 schema:即使绕过 CLI,也会拒绝监听通配地址。 这是有意的:`0.0.0.0` 会把 agent 暴露到所有网卡(包括不可信网络)。绑定本机的局域网 IP 能达到同样效果,而且只暴露一个接口: ```bash ip -4 route get 1.1.1.1 | sed -n 's/.* src \([0-9.]*\).*/\1/p' # 例如 192.168.1.120 DSH_WEB_TOKEN='your-long-secret' dsh --profile web --host 192.168.1.120 ``` 其他电脑打开 `http://192.168.1.120:3080/?token=your-long-secret`。此时监听器只绑定这个地址,本机 `127.0.0.1` 反而不通,这是预期行为。 注意 launcher 参数顺序:`--patch` 是 dsh launcher 的参数,必须放在 `--host` 这类 app 参数前面,否则会被当成 app 参数。 ### 用 `dsh-lan` 自动选地址 包里的 `bin/dsh-lan` 会自动找默认路由所在网卡的 IPv4,并把 `--host 0.0.0.0` 翻译成该地址: ```bash DSH_WEB_TOKEN='...' /home/bushuhui/pi-lab/0_ai_agent/dsh/dsh-fixed-token/bin/dsh-lan DSH_WEB_TOKEN='...' /home/bushuhui/pi-lab/0_ai_agent/dsh/dsh-fixed-token/bin/dsh-lan --host 0.0.0.0 --port 3080 ``` 它不需要先把包安装成 bundle:脚本会生成临时 overlay 挂载 `lib/index.js`,退出时清理。也可以用 `DSH_LAN_HOST` 指定地址、`DSH_LAN_PROFILE` 指定 profile。 ### 防火墙 Ubuntu 上 `ufw` 默认拒绝入站,需要放行端口。只放行局域网网段更稳: ```bash sudo ufw allow from 192.168.1.0/24 to any port 3080 proto tcp ``` 其他系统放行对应端口即可。IP 若由 DHCP 分配,建议在路由器上做静态租约,否则 IP 变了 cookie 和收藏地址都会失效。 ## 安装 ### 方式 A:作为 bundle 安装(推荐) ```bash dsh plugin --profile web add /home/bushuhui/pi-lab/0_ai_agent/dsh/dsh-fixed-token DSH_WEB_TOKEN='your-long-secret' dsh web ``` `dsh plugin add` 会把这个本地包加进 profile 依赖;因为它声明了 `dsh.bundle.patch`,安装成功后会自动追加到 `dsh.profile.bundles` 并挂载,不需要手改配置。安装后重启 `dsh web`;已经在跑的进程不会重新打印 URL。 > `package.json` 里是 `"private": true`,只适合本地使用。 ### 方式 B:不安装,用 profile patch 直接指向入口 在 `~/.dsh/profiles/web/cordis.patch.yml` 追加: ```yaml - insert: - id: fixed-web-token name: /home/bushuhui/pi-lab/0_ai_agent/dsh/dsh-fixed-token/lib/index.js ``` 或者只在本次启动生效。先写一个 overlay 文件(例如 `~/fixed-token.patch.yml`): ```yaml - insert: - id: fixed-web-token name: /home/bushuhui/pi-lab/0_ai_agent/dsh/dsh-fixed-token/lib/index.js ``` 然后: ```bash DSH_WEB_TOKEN='your-long-secret' dsh web --patch ~/fixed-token.patch.yml ``` ## 配置 优先级:`DSH_WEB_TOKEN` 环境变量 > 插件 `config.token`。 ```yaml - id: fixed-web-token config: token: 'your-long-secret' ``` 推荐用环境变量。写进 YAML 意味着 secret 落在配置文件里,记得检查文件权限。 ## 验证 ```bash curl -s -o /dev/null -w '%{http_code}\n' 'http://127.0.0.1:3080/?token=your-long-secret' # 303 curl -s -o /dev/null -w '%{http_code}\n' 'http://127.0.0.1:3080/?token=wrong' # 401 ``` 303 表示拿到了 cookie;再用这个 cookie 访问不带 token 的地址应为 200。 ## 停用与卸载 - 不固定:不设 `DSH_WEB_TOKEN`,并清掉 `config.token`,插件自动 no-op。 - 单行禁用:在 patch 里给该行加 `disabled: true`。 - 卸载: ```bash dsh plugin --profile web remove dsh-fixed-token ``` ## 安全提醒 - 固定 token 等于固定密码。不要用短口令,也不要把它提交到仓库。 - 默认只监听 loopback 是安全的;如果绑定非 loopback 或经代理对外,请配 TLS,并把这个 token 当成真实凭据管理。 - 绑定局域网 IP 后,token 就是唯一认证。只在你信任的网段使用,不要把端口映射到公网。 - token 只负责首次换取 cookie;已经签发的 cookie 在有效期内依然有效,换 token 不会吊销旧 cookie。 ## 实现与兼容性 - 入口:`lib/index.js`,零运行时依赖,不需要构建。 - `bin/dsh-lan` 只做地址探测和参数拼装,不修改 DSH 的绑定校验。 - 依赖的内部字段:`connection.browserAuth.launchToken`。插件对缺失字段做了守卫:DSH 升级后如果改名字段,它只会打印警告并保持随机 token,不会让启动失败。 - 已在 DSH `0.2.1-rc.2` 验证:固定 token → 303,错误 token → 401,无 cookie → 401,带 cookie → 200。 ## 测试 ```bash cd /home/bushuhui/pi-lab/0_ai_agent/dsh/dsh-fixed-token node test/smoke.mjs ```