dsh-lark-web-auth:DeepSeek Harness Web GUI 的飞书登录与多用户 session 隔离

前言

DeepSeek Harness 的 Web GUI 适合本地或内部使用。当同一个 Web GUI 被多个用户访问时,需要解决两个具体问题:访问者身份从哪里来,以及每个用户能看到哪些 session

dsh-lark-web-auth 面向这个场景,给 DeepSeek Harness Web GUI 增加飞书 OAuth 登录,并按 open_idsession 隔离。它属于 DSH 社区插件生态;DSH 社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系。

这是什么

dsh-lark-web-auth 是一个 DeepSeek Harness 插件,由 Awesome-AI-Pedia 维护,许可证为 MIT。

它的定位是:给 DeepSeek Harness Web GUI 增加飞书登录,并让每个用户只能看到、访问、修改自己的 session

它可以独立使用,仅做 Web 端登录,不与飞书 bot 交互;也可以与 dsh-lark-link 配合,使飞书 bot 会话在用户登录网页后自动看到。

核心功能

  • 飞书 OAuth 登录:未登录用户访问网页时自动跳转飞书授权,回调后写 httpOnly cookie。
  • session 隔离:每个 session_id 归属一个 open_id,用户只能看到、访问、修改自己的 session
  • 不泄露存在性:非 owner 请求统一返回 404
  • 登录态持久化:使用 SQLite 存储,进程重启不掉线。
  • 零前端源码修改:通过 webServer.tapIndex() 注入小 UI。
  • 存量 session 回填:首次启动时扫描 dm:* 前缀的 session,通过飞书 API 反查 chat_idopen_id,并写入归属表。
  • dsh-lark-link 配合:使飞书 bot 会话在用户登录网页后自动看到。

隔离怎么做

下面按请求链路说明隔离方式。

1、HTTP 层:所有 /api/* 请求先过 middleware 校验 cookie,未登录返回 401

2、RPC 层:typertagent / session lookup 被包一层,请求上下文里的 openId 必须等于 session_owner 表里的记录。

3、列表层:session.list API 返回值过滤,只保留 owner 匹配的项。

4、新 session:监听 session/created 事件,把 request context 的 openId 写入 session_ownerdm:* 前缀的 dsh-lark-link 会话按 chat_id 反查 open_id

安装与启用

先安装插件:

dsh plugin --profile web add dsh-lark-web-auth

插件以当前 dsh 进程权限运行,安装前应检查源码和 MIT 许可证。

此插件必须在 api-remotes 之后加载,否则 typert lookup 覆盖可能失效。

配置

需要设置以下必需环境变量:

LARK_WEB_APP_ID
LARK_WEB_APP_SECRET
LARK_WEB_BASE_URL
LARK_WEB_COOKIE_SECRET

其中 LARK_WEB_COOKIE_SECRET 需要 32+ 字节随机串。旋转该值会踢下所有用户。

可选环境变量如下:

LARK_WEB_AUTH_ENABLED
LARK_WEB_DB_PATH
LARK_WEB_DOMAIN
  • LARK_WEB_AUTH_ENABLED=false 可临时禁用。
  • LARK_WEB_DB_PATH 默认是 ~/.dsh/lark-web-auth.sqlite
  • LARK_WEB_DOMAIN 可设为 feishulark

飞书开放平台设置

在飞书开放平台的自建应用中完成以下设置。

1、添加网页主页地址:

https://web.yourdomain.com

2、在安全设置中配置重定向 URL:

https://web.yourdomain.com/auth/lark/callback

3、在权限管理中开通:

contact:user.base:readonly

这里的 web.yourdomain.com 是示例域名,替换为实际公网或内网域名。

部署示例

下面是一个 Caddy 示例,将域名反向代理到本机 3080 端口:

web.yourdomain.com {
    reverse_proxy localhost:3080
}

启动前设置环境变量,再启动 Web profile:

export LARK_WEB_APP_ID=cli_xxxxx
export LARK_WEB_APP_SECRET=xxxxx
export LARK_WEB_BASE_URL=https://web.yourdomain.com
export LARK_WEB_COOKIE_SECRET=$(openssl rand -base64 32)
dsh --profile web

示例中的 cli_xxxxxxxxxxweb.yourdomain.com 都需要替换为实际值。

适用场景与限制

这个插件适合需要飞书身份登录 DeepSeek Harness Web GUI 的场景,也适合单机、多人隔离访问的内部部署。

需要注意以下限制:

  • 单机 SQLite 存储,不支持多实例部署,README 称 100 人以内足够。
  • 存量数据回填是尽力而为。如果飞书 API 反查 chat_idopen_id 失败,该 session 会保留无 owner 状态,任何人都看不到,需要手动分配。
  • 不支持团队/群组 session 共享,一个 session 只能属于一个人。
  • 未做审计日志,即未记录谁看了谁的 session
  • LARK_WEB_COOKIE_SECRET 旋转后,所有用户会被踢下线。
  • 插件必须在 api-remotes 之后加载。

结尾

dsh-lark-web-auth 的价值在于:用飞书 OAuth 作为 Web 端登录方式,并把 DeepSeek Harness 的 session 按用户隔离。它不改前端源码,配置集中在环境变量,既可单独使用,也可与 dsh-lark-link 组合使用。

GitHub 仓库:https://github.com/Awesome-AI-Pedia/dsh-lark-web-auth

社区目录页 URL 未在已核实资料中给出,可在 DSH 社区目录搜索 dsh-lark-web-auth

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye