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. 鉴权与安全

签名凭证 Token

凭证 Token 是你的应用签发、你的应用校验,石墨原样透传的 Token 到你的回调接口。
石墨文档中台不会解析、也无法校验 Token 是否合法性,这意味着 Token 的格式和密钥完全由你掌握,安全模型也完全由你负责。
石墨文档中台支持哪些格式?

一、用途与传递路径#

凭证 Token 解决的是“石墨回调过来时,你的应用如何知道这是哪个用户、哪个业务上下文”的问题,整个签发和校验流程大概如下所示:
要点:
签发者 = 校验者。石墨只透传,不解析。这是 Token 与 Signature 最本质的区别——Signature 是石墨当校验者,Token 是你的应用既当签发者也当校验者。
Token 由后端签发。前端不持有任何密钥,每次需要就向后端取一次新的。
回调里的 Token = 你给出去的那个 Token。石墨拿到什么就回什么——这同时意味着,一旦签发出去,在它过期前会随每次相关回调反复被使用。

二、Token 应包含的信息#

2.1 必须包含:用户身份#

Token 必须能让你的应用识别出"这次回调来自哪个业务用户"。一般做法是把用户 id 编码进 Token字段中,(不要直接编码用户名、邮箱、手机号这类敏感字段,需要的话用用户 id 去查):
{
  "uid": "user_123"
}
如果你的系统是多租户的,再加上租户 id:
{
  "uid": "user_123",
  "tenantId": "tenant_42"
}

2.2 可选:业务透传字段#

因为石墨不会改 Token,你可以借这条通道把"调用上下文"原样传到回调侧。最常见的用法是 trace_id(链路追踪 id)——以导入为例:
可以放在 Token 里的典型字段:
字段用途
uid / userId必含。识别业务用户
tenantId多租户场景识别租户
trace_id把"前一跳的调用上下文"传到回调侧
exp / iat过期与签发时间(推荐用 JWT 的标准字段)
scope标记本次签发的权限范围(如"仅可读")
请勿塞进 Token 的信息:明文密码、明文身份证、明文手机号、信用卡号、API 密钥等。Token 在网络中流转,一旦泄露这些信息会跟着泄露。

三、Token 生成方式#

石墨对 Token 格式没有要求,下面三种是常见的实现层级,按"安全 vs 复杂度"递增。生产环境推荐方式二(JWT),足够覆盖绝大多数接入需求。

3.1 方案对比#

方案安全级别实现复杂度性能可调试性推荐场景
JSON 明文⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐开发联调、内网验证
JWT 签名(推荐)⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐生产环境通用
AES-256-GCM 加密⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐合规要求高、载荷需保密
三种方案选型上有两条主线:
要不要防篡改? 要 → JWT 起步;不要(仅内网联调) → JSON 明文够用。
Token 内容本身是不是敏感? 是 → AES-256-GCM;否(用 id 而不是 PII) → JWT 已够。

3.2 方案一:JSON 明文(本地调试)#

最简单的形式:直接把对象 JSON 化、Base64 编码后作为 Token。
{
  "uid": "user_123",
  "traceId": "aabbccdd123456",
  "timestamp": 1640995200000
}
适用场景:
联调阶段,希望能直接肉眼读 Token 内容。
完全可信的内网部署,攻击面有限。
注意:不适合在生产环境使用此方案,没有签名意味着任何人拿到 Token 都能伪造、改造一个新的塞进去。

3.3 方式二:JWT 签名(生产环境推荐)#

JWT (JSON Web Token) 在 JSON Payload 上加一段 HMAC 签名,校验侧用同样的 secret 重算签名比对,能防篡改但不防偷看。
JWT 的生成与校验细节可以参考 签名凭证-Signature 里的算法说明,两者用同一类 HMAC 思路,只是 secret 必须不同。
Token 的 secret 一定要和 Signature 的 secret 分开。Signature 的 secret 是石墨派发给你的应用接入凭证;Token 的 secret 是你的应用内部自留的,石墨从不接触。两者混用一旦其中一个泄露,另一个的安全模型就全部塌掉。
最终 Token 形如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJ1c2VyXzEyMyIsInRyYWNlSWQiOiJhYWJiY2NkZDEyMzQ1NiIsImV4cCI6MTY0MDk5NTIwMCwiaWF0IjoxNjQwOTkxNjAwLCJpc3MiOiJ5b3VyLWFwcC1uYW1lIn0.signature_hash_here
适用场景:
绝大多数生产环境。防篡改、能带过期时间、各语言生态成熟。
Payload 里只有 id 类轻量字段、不介意被 base64 解码看到结构。

3.4 方式三:AES-256-GCM 加密(生产环境推荐,更复杂安全性更高)#

JWT 的载荷虽然防篡改但可读。如果你的应用有合规要求,载荷本身也不能让人看见(例如载荷包含内部权限标签、组织结构 id),就需要再加一层对称加密。
通常 JWT 已能满足安全需求;只有当企业合规需要"载荷完全不可读"时再升级到这一档。下面给出 Java / Go / Python 三种语言的 AES-256-GCM 完整示例,IV 12 字节、AAD 固定串、密文与 IV 各自 base64 后下发。
Java
Go
Python
实现要点:
IV / nonce 必须随机且不重复。同一 secret 下 IV 复用 = AES-GCM 安全性归零。
**AAD(附加验证数据)**生成与校验必须一致。可以塞进版本号、环境标识,对应 Token 在跨环境下不能互认。
secretKey 长度需为 32 字节(AES-256)。示例里用 SHA-256 派生是常见做法。
密文 + IV(+ AuthTag)需要一起下发。任何一段丢失都无法解密。

四、Token 的校验#

回调接口拿到 X-WebOffice-Token 之后,至少要经过如下流程校验:
校验各环节关键点:
签名 / AAD 校验。JWT 校验 HMAC 是否一致;AES-256-GCM 解密时如 AAD 不匹配会直接报错——这一步同时完成"防篡改"和"防跨环境串"。
过期时间。Token 内部最好带 exp,校验时拒绝过期。建议生命周期与浏览器会话同量级(如 30 分钟到 2 小时),不要给得太长。
吊销 / 黑名单。用户登出、密码变更、Session 撤销时,要让仍未过期的 Token 立即失效。常见做法:服务端维护一张吊销表,校验时查一次;或者 Token 里塞 sessionId,校验时确认 session 仍活跃。
业务权限二次校验。Token 通过只能证明"来源合法",不能证明"该用户对当前文件有权限"。文件级权限校验应放在 Token 校验之后,由你的应用业务侧再判一次。
失败统一返回 4xx:鉴权问题用 401,业务拒绝用 403。详细原因见 签名凭证:Signature 与 Token。

五、常见误区#

误区实际影响正确做法
在前端直接用密钥签 Token密钥泄露,任何人都能伪造 TokenToken 一律由你的应用后端签发,前端只拿结果
Token 用明文 JSON 上生产任何人改造载荷都能冒充用户至少升级到 JWT 签名(方式二)
Token 与 Signature 共用同一个 secret一处泄露=两处全塌两套 secret 物理分开、分开轮换
Token 里直接塞手机号 / 邮箱 / 身份证一次泄露 PII 跟着泄露只放 id,敏感信息你的应用按 id 自己查
不带过期时间一旦泄露永久可用加 exp 字段,建议 ≤ 2 小时;同时维护吊销表
用户登出后 Token 仍能调通回调离职 / 撤权后还能继续操作维护 sessionId + 吊销表,校验时联动
Token 校验只判"格式对"改个 uid 就能冒充别的用户必须校验签名(HMAC 或 GCM AAD),不只看结构
把 Token 当业务幂等键同一会话内多次回调 Token 相同,幂等键失效幂等键用业务事件 id / trace_id,不要用 Token
AES-GCM 复用同一 IV安全性直接归零每次加密生成 12 字节随机 IV,不复用
同一个 Token 被多个用户复用当前用户回调返回错人Token 与用户一一绑定,会话维度签发
修改于 2026-06-22 02:43:30
上一页
整体概述
下一页
签名凭证 Signature
Built with