1. 02. 鉴权与安全
石墨文档中台-开发文档
  • 1. 适用范围
  • 00. 概述
    • 石墨文档中台能做什么?
    • 三种典型的业务接入场景
    • 石墨文档中台支持哪些格式?
  • 01. 快速开始
    • 基本概念
    • 场景一:10 分钟创建预览文件
    • 场景二:10 分钟创建协同编辑文件
  • 02. 鉴权与安全
    • 整体概述
    • 签名凭证 Token
    • 签名凭证 Signature
  • 03. 文件预览
    • 整体概述
    • 如何预热预览缓存
    • 如何防盗链
    • 常见问题处理
  • 04. 文件编辑
    • 整体概述
    • 协同文档权限设计
    • 协同文件保存与更新机制
    • 协同文件复制与删除
  • 05. 文件导入导出
    • 整体概述
    • 常见问题处理
  • 06. 石墨前端 API
    • 整体概述
    • 公共 API
      • 公共处理方法
      • 顶部栏定制 HeaderBars
    • 编辑器 API
      • 轻文档
      • 传统文档
      • 表格
      • 幻灯片
      • 表单
      • 应用表格
  • 07. 石墨后端 API
    • 整体概述
    • 错误码说明
    • 文件-预览 API
      • 访问预览文件
      • 创建文件预览缓存
    • 文件-协同编辑文件管理 API
      • 访问协同编辑文件
      • 创建协同文件
      • 创建协同文件副本
      • 删除协同文件
    • 文件-导入导出 API
      • 文件导入
        • 文件导入说明
        • 创建导入任务
        • 获取导入进度
        • 创建导入任务(旧版)
        • 获取导入进度(旧版)
      • 文件导出
        • 文件导出流程
        • 创建导出任务
        • 获取导出进度
    • 文件-表格文件(Excel) API
      • 表格接口参数说明
      • 获取表格内容
      • 获取表格中的评论数
      • 更新表格内容
      • 追加表格内容
      • 删除表格行
      • 新增表格工作表
    • 文件-文稿文件(Word) API
      • 文稿书签说明
      • 读取文稿书签内容
      • 替换文稿书签内容
    • 文件-文档文件(类 Markdown) API
      • 获取文档中的评论列表
    • 文件-应用表格文件(多维表格)API
      • 应用表格列及单元格值结构
      • 应用表格接口调用规则
      • 获取数据表列表
      • 创建数据表
      • 获取字段列表
      • 创建字段
      • 更新字段
      • 删除字段
      • 新增行
      • 获取单行
      • 更新行
      • 删除行
    • 文件-获取额外信息 API
      • 获取文件的纯文本内容
      • 文件纯文本字数统计
      • 获取文件的历史列表
      • 获取文件的版本列表
      • 获取文件内容中所有的 @ 人信息列表
      • 还原文件历史版本
    • 系统管理 API
      • 应用管理
        • 获取应用详情
        • 更新应用回调地址
      • 用户席位管理
        • 用户席位状态说明
        • 获取用户列表和席位状态
        • 激活用户席位​
        • 取消用户席位​
        • 批量设置用户席位
    • 其他 API
      • 上报事件
      • 创建行为历史
      • 推送文件内全部的用户
      • 推送用户全部的 websocket 连接
    • 获取行列表
  • 08. 回调接口(你的应用需实现的接口)
    • 整体概述
    • 文件信息
      • 文件权限说明
      • [重要] 获取文件元信息-协同文档
      • [重要] 获取文件元信息-预览文档
      • 获取当前用户的文件列表
      • 获取文件的协作者列表
      • 获取接入方指定文件的完整访问地址
      • 获取文件元信息-协同文档自动任务(admin)
      • 根据指定用户获取文件元信息-协同文档(admin)
    • 用户信息
      • 批量获取用户信息(admin)
      • [重要] 获取当前用户信息
      • 获取当前用户所在团队信息
      • 获取指定用户信息
      • 获取用户水印信息
      • 获取用户部门路径
      • 批量获取用户信息
    • 团队和部门
      • 特殊部门 ID 说明
      • 获取团队下的成员列表
      • 获取部门信息
      • 获取部门的下级部门节点
      • 获取部门下的成员分页列表
    • 搜索功能
      • 获取与文件相关的用户列表
      • 获取与文件相关的文件列表
      • 按关键字搜索文件和用户列表
    • 事件推送
      • 整体概述
      • 评论(Comment)
        • 轻文档
          • 添加评论
          • 删除评论
          • 结束评论
          • 对于评论的回复评论
        • 表格
          • 添加评论
          • 删除评论
          • 结束评论
          • 对于评论的回复评论
        • 传统文档
          • 对于评论的回复评论
          • 添加评论
          • 更新评论
          • 删除评论
        • 幻灯片
          • 添加评论
          • 删除评论
          • 结束评论
          • 对于评论的回复评论
        • 应用表格
          • 添加评论
          • 对于评论的回复评论
          • 删除评论
      • 讨论(Discussion)
        • 轻文档
          • 发送讨论消息
      • 提及(MentionAt @ 人)
        • 轻文档
          • 在评论中 at
          • 在讨论中 at
          • 在正文中 at
        • 表格
          • 在评论中 at
          • 在正文中 at
        • 传统文档
          • 在评论中 at
          • 在正文中 at
        • 应用表格
          • 在评论中 at
          • 在正文中 at
      • 日期提醒 (DateMention)
        • 轻文档
          • 创建
          • 修改
          • 删除
        • 表格
          • 创建
          • 修改
          • 删除
        • 传统文档
          • 创建
          • 修改
          • 删除
      • 文件内容更新 (FileContent)
        • 文件内容更新
      • 文档协作者协同状态变化 (Collaborator)
        • 文档协作者协同状态变化
      • 文件版本 (Revision)
        • 版本
      • 系统事件 (System)
        • 系统事件
      • 回调请求错误(实验性)
        • 回调请求错误
  • 09. 核心模型
    • 你的应用如何设计应用(app)模型?
    • 你的应用如何设计文件数据模型?
    • 你的应用如何设计通讯录模型?
    • 你的应用系统如何设计文件权限模型?
  • 10. 典型场景方案
    • 云盘场景
    • IM 场景
    • 示例代码仓库
  • 11. 常见问题
    • 访问接口提示 Signature
    • 文件预览或导入报错
    • 首次接入 SDK 报错
    • 文档预览如何做防盗链
    • 复制粘贴、全屏操作不正常
    • 如何实现文档模板功能
    • 文档内容何时保存
    • 移动端不支持 blob 协议导致预览失败
    • 如何实现文件重命名
    • 如何通过接口修改文档内容
    • @人员时如何直接跳转至对应锚点
  1. 02. 鉴权与安全

整体概述

石墨文档中台和你的应用是双向调用关系:你的应用会调用石墨的接口,石墨也会回调你的应用。两个方向需要不同的凭证,Signature (X-WebOffice-Signature) 和 Token (X-WebOffice-Token) 分别承担其中一边的鉴权。
这两种凭证经常被混淆,是接入过程里最容易踩坑的环节之一。

一、为什么需要两种凭证?#

石墨与你的应用的调用是双向的:
你的应用 → 石墨:石墨需要确认请求来自"合法接入方",也就是说石墨文档中台对这些外部请求的鉴权基于 Signature。Signature 由 appId 和 secret 并结合特定的算法生成,只有合法的接入方才能签出有效的 Signature。
石墨 → 你的应用:你的应用需要确认回调来自"合法石墨服务",也就是说你的应用对外部请求的鉴权主要基于 Token。Token 由你的应用提前签发并由石墨透传回来,里面还可以嵌入用户 id 这类业务信息。
石墨主动通知场景:石墨内部产生的周期性任务、系统事件,这类请求不是由用户主动触发、没有用户上下文的信息,因此石墨拿不到 Token,这种场景下你的应用也需要支持使用 Signature 的方式来完成对来自石墨文档请求的鉴权。

二、两种签名凭证详细说明#

签名凭证分为 X-WebOffice-Signature(以下简称 Signature)和 X-WebOffice-Token(以下简称 Token)两种类型:
凭证类型Header 名主要作用其他作用
SignatureX-WebOffice-Signature石墨文档中台 用来校验外部请求是否合法某些场景下石墨无法提供 Token,因此你的应用回调接口也需支持通过 X-WebOffice-Signature 校验请求来自石墨
TokenX-WebOffice-Token你的应用 校验来自石墨文档中台的请求是否合法携带接入方需要透传的信息,例如用户 id 等
具体接口是否携带 Signature 或 Token,以及携带哪种 / 几种,请查阅对应接口文档。下文给出的是最典型的两种场景。
两者的关键差异:
维度SignatureToken
签发者你的应用(基于 appId、secret 生成)你的应用(用自定义业务规则)
校验者石墨文档中台后端;
你的应用后端(仅主动通知场景)
你的应用后端
是否携带业务信息否是(可携带用户 id、租户 id 等信息)
生命周期短(一般几分钟到几十分钟,有参数里的 ts 决定)你的应用自行决定,建议短期
主要风险时钟漂移、secret 泄露重放攻击、Token 泄露

三、签名凭证传递流程#

3.1 典型场景:用户操作触发#

绝大多数业务动作都由用户在浏览器端发起。此时你的应用前端先向后端要 Signature + Token,再交给石墨 JS SDK;JS SDK 用它们去调石墨,石墨回调你的应用时把 Token 原样带回来。
要点:
Signature 由你的应用后端签发,前端不持有 secret,避免泄露。
Token 由石墨透传回来,你的应用回调接口直接验自己签的内容即可。
签名要短期化:每次会话取一次新的 signature + token,过期了重新换。

3.2 石墨文档中台主动通知场景:石墨主动触发#

在某些场景下,石墨会主动发起回调到你的应用,这些场景不是由用户操作触发,所以石墨无法提供 Token 信息:
周期性任务:石墨内部的定时统计 / 清理任务产生的通知。
系统事件:与具体用户无关的全局事件,例如文档协同会话异常关闭、批处理结果回传等。
延迟事件:用户早已离开页面,但石墨这边某个状态变更才落地,需要异步通知。
这些请求只能携带 Signature,由你的应用后端用同一对 appId + secret 来校验请求是否合法。
要点:
这条链路里没有用户、没有前端、没有 JS SDK——你的应用回调接口必须能独立用 Signature 完成鉴权,不能假设一定能拿到 Token。
同一个回调接口要支持"Signature + Token 双凭证(典型场景)"和"仅 Signature(主动通知)"两种入站方式,按 Header / Credential-Type 自动分支。
校验失败必须返回 4xx,不要返回 200——否则石墨会认为接收成功、不再重试,事件就丢了。

四、回调接口的鉴权实现#

你的应用回调接口实现的请求鉴权业务流程大概如下所示:
实现要点:
统一入口、分支鉴权。所有石墨回调走同一个 endpoint,按 X-WebOffice-Credential-Type 与 Token 是否存在做分支,不为每种事件单独配 URL。
Signature 校验要带 ts。用 appId + secret + ts + nonce 这类参数生成签名,校验时比对计算结果,同时拒绝 ts 偏离当前时间过大(建议 ±5 分钟)的请求。
Token 自己签自己验。Token 是你的应用签发的(JWT / HMAC / 自定义都行),校验只跟你的应用密钥相关。Token 里塞业务上下文(如 userId / tenantId)时记得只放 id 不放敏感数据。
时钟同步。所有服务节点跑 NTP,避免因时钟漂移把合法请求误判为重放。
校验失败明确返回 4xx。建议 401(鉴权信息缺失或无效)/ 403(鉴权通过但业务上拒绝);不要返回 5xx,会让石墨当成自己出问题而无意义重试。

五、构造方式#

具体的签名算法、参数顺序、编码格式按对应文档:
签名凭证 - Signature(参考:co18-03-02-Signature-签名.md)
签名凭证 - Token(参考:co18-03-03-Token-与回调鉴权.md)
涉及到把 appId + secret 写进配置时,按 co18-03-05-安全上线清单.md 的要求保护好密钥。

六、常见误区#

误区实际影响正确做法
在前端持有 secret 直接签 Signaturesecret 泄露后整个接入身份被人冒用Signature 一律由你的应用后端签发,前端只拿结果
假设石墨回调一定带 Token主动通知场景没有 Token,被回调接口直接拒绝,事件丢失同一入口支持"Signature + Token"和"仅 Signature"两条分支
校验失败返回 200石墨判定送达成功,不再重试,事件永久丢失鉴权失败必须返回 4xx(401 / 403)
校验失败返回 5xx石墨触发无意义重试,把日志和服务都打爆鉴权失败返回 4xx;只有自身业务异常才返回 5xx
不校验时间戳 / 不拒绝过期 ts攻击者可拿历史请求重放拒绝偏离当前时间 > 5 分钟的请求,并维护短期 nonce 防重放
Token 里塞用户邮箱 / 手机号等敏感数据一旦 Token 泄露,PII 跟着泄露Token 只放 id 类轻量字段,敏感信息你的应用自己根据 id 查
Signature 拿来当业务幂等键Signature 每次都不一样,不可比对业务幂等键自己维护(事件 id / 任务 id / 业务键)
多节点时钟未同步偶发合法请求被误判为重放所有节点跑 NTP;Signature 校验允许 ±5 分钟容差
把 secret 提交到代码仓库一次泄露永久泄露用密钥管理(KMS / Vault / 环境变量),CI 里做秘密扫描
同一份 Signature 在前端被复用打多次接口一旦窗口过期后续请求全部失败每次会话取一次新的 signature + token,按需刷新
修改于 2026-06-22 02:43:30
上一页
场景二:10 分钟创建协同编辑文件
下一页
签名凭证 Token
Built with