飞书授权卡片通道方案(DSH 引擎层扩展 approval-feishu + auth_request.py 发卡,dsh-im 零修改) #4733
evilh2019
started this conversation in
Show Your Plugins!
Replies: 1 comment
|
这个方向里,把飞书接在
我把这套模型、恢复语义和 36 个验收门整理成了可视化指南,便于直接对实现逐项检查: 核心结论可以压缩成一句:many observers, one decision owner; card state is a projection, not authority. |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
方案背景
飞书通道的提权审批需要发交互式授权卡片(用户点卡片按钮直接授权),web GUI 通道维持浏览器弹窗,两通道互不混淆。
设计硬约束:dsh-im 插件升级必须天然继承此能力 → 因此禁止修改 dsh-im 源码,方案完全落在 DSH 引擎层。
架构
extensions/approval-feishu(packages/extensions/下的私有扩展)auth_request.py(独立工作区,lark-cli发送,零 LLM 依赖)card.action.trigger→ 写authDir/<auth_id>.json→message.patch结果卡授权卡 UX(已全部实测验收)
⏱️ 有效期 N 秒(截止 HH:MM:SS),超时自动失效lark-cli api PATCH /open-apis/im/v1/messages/{id}更新原卡elements+{"tag":"action"}),按钮一行横排;Card 1.0 按钮value字段与 dsh-im 回调原生兼容disabled:true+disabled_tips:"授权已过期,请重新发起",header 变灰双层防线(超时后点击双重拒绝)
timeout;dsh-im 见status !== 'pending'直接 return顺序铁律:必须先写状态文件 timeout、再 patch 卡片,否则 patch 期间(≤30s)状态仍 pending,点击会被接受(竞态漏洞,已修复)。
Schema 匹配铁律
message.patch要求 patch 卡片与原消息 schema 一致:Card 1.0 原消息必须 Card 1.0 结构 patch,Card 2.0 必须 Card 2.0 结构——不一致报 230099。patch_card_expired内置容错:Card 1.0 失败自动改 Card 2.0 重试。升级继承
dsh-im tgz 升级天然不影响(零修改);DSH 侧三处改动均有备份/恢复路径(upgrade-dsh.sh --backup/--restore + $DSH_HOME patch + 独立工作区脚本)。
讨论点
packages/extensions/的价值?还是保持社区私有扩展?E2E 实测证据:5 条闭环(授权通过 / 60s 超时自动更新 / Card 1.0 横排点击 / 灰化 disabled / 僵尸卡 schema 容错)。
All reactions