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_id 做 session 隔離。它屬於 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_id 到 open_id,並寫入歸屬表。
  • 與 dsh-lark-link 配合:使飛書 bot 會話在用戶登錄網頁後自動看到。

隔離怎麼做

下面按請求鏈路說明隔離方式。

1、HTTP 層:所有 /api/* 請求先過 middleware 校驗 cookie,未登錄返回 401。

2、RPC 層:typert 的 agent / session lookup 被包一層,請求上下文裏的 openId 必須等於 session_owner 表裏的記錄。

3、列表層:session.list API 返回值過濾,只保留 owner 匹配的項。

4、新 session:監聽 session/created 事件,把 request context 的 openId 寫入 session_owner;dm:* 前綴的 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 可設爲 feishu 或 lark。

飛書開放平臺設置

在飛書開放平臺的自建應用中完成以下設置。

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_xxxxx、xxxxx 和 web.yourdomain.com 都需要替換爲實際值。

適用場景與限制

這個插件適合需要飛書身份登錄 DeepSeek Harness Web GUI 的場景,也適合單機、多人隔離訪問的內部部署。

需要注意以下限制:

  • 單機 SQLite 存儲,不支持多實例部署,README 稱 100 人以內足夠。
  • 存量數據回填是盡力而爲。如果飛書 API 反查 chat_id 到 open_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。

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

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

小夜