Skip to main content

背景与使用场景

这个能力做什么

飞书文档读取能力让用户生成的应用读取有权访问的新版飞书文档(Docx)纯文本。它支持两种输入:
  • https://{tenant}.feishu.cn/docx/{document_token} 形式的 Docx 链接。
  • https://{tenant}.feishu.cn/wiki/{node_token} 形式的知识库链接;先解析节点,再读取底层 Docx。
首版只读取标题和纯文本,不处理图片、附件、表格、画板、电子表格、多维表格或旧版 Doc。

与其他飞书 Skill 一致的架构

本能力是用户应用运行时能力,不是 Agent 工具。调用链与飞书消息、通讯录等现有 Skill 一致:
不要把 App Secret 或 access token 返回给浏览器,也不要在 Gateway、LLM Gateway 或 Agent 中新增飞书文档代理。

一、前置配置

1.1 环境变量

复用基础 FEISHU 插件已经写入用户 Supabase 项目的前两个 secrets,并为文档读取能力额外配置服务端文档白名单: 不需要额外的平台 API key。App Secret 和文档白名单都通过安全配置界面写入 Edge Function Secrets,不要让用户在对话中粘贴。

1.2 产品访问策略

完整模板默认采用两层授权:
  1. 调用者必须是 Supabase Auth 的真实登录用户;公开的 anon key 不能代替用户身份。
  2. 文档必须命中 SUPERUN_FEISHU_ALLOWED_DOCUMENTS。白名单按原始链接填写:Docx 使用 docx:{document_token},Wiki 使用 wiki:{node_token}
该默认策略表示“所有已登录产品用户都能读取白名单文档”。如果产品需要按用户、组织或角色进一步隔离,必须把模板中的白名单检查替换为数据库授权查询,并使用当前登录用户的 user.id 做条件;不能只依赖飞书应用本身的资源权限。

1.3 飞书权限

在飞书开放平台为企业自建应用开通并发布:
权限审批后必须发布应用新版本。应用还必须具有目标文档或知识库节点的实际访问权限;只有 API scope 并不等于可以读取任意私有文档。

二、飞书 API

2.1 获取 tenant_access_token

2.2 解析 Wiki 节点

读取 data.node.obj_tokendata.node.obj_type。首版仅接受 obj_type=docx

2.3 获取文档基本信息与纯文本

标题来自基本信息接口,纯文本来自 data.content

三、完整 Edge Function

前端只向 Edge Function 传文档链接:
supabase.functions.invoke 必须在用户登录后调用,以便自动发送用户 session JWT。未登录页面不要调用该函数。

四、本地测试

可以在用户项目中启动 Supabase 本地栈并单独运行函数:
supabase/.env.local 只保存在本地,不提交到 Git:
先从本地登录会话中取得用户 access token,再用非法域名验证本地校验;不要使用公开的 anon key:
真实文档联调需要有效的飞书应用凭证、已发布权限,以及应用对目标文档的实际访问权。不要为了验证模板在共享环境中提交真实凭证。

五、验收清单

  1. Docx 链接返回标题和纯文本。
  2. Wiki 链接先解析节点,底层为 Docx 时返回内容,其他类型给出明确提示。
  3. 非飞书域名、非 HTTPS、非法 token 和不支持的路径在 Edge Function 内被拒绝。
  4. 未登录、仅携带 anon key、未命中文档白名单的请求分别返回 401 / 403,且不会请求飞书。
  5. 浏览器包、日志、响应和数据库中没有 App Secret 或 access token。
  6. 凭证仅来自 SUPERUN_FEISHU_APP_ID / SUPERUN_FEISHU_APP_SECRET,文档范围仅来自服务端白名单。
  7. 连续读取复用未过期的 tenant_access_token;并发冷启动请求只发起一次 token 获取。
  8. 飞书权限、限频、上游故障和超时不会被统一伪装成 400。
  9. 实现没有新增 Gateway、LLM Gateway 或 Agent tool 调用。