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 名 | 主要作用 | 其他作用 |
|---|---|---|---|
| Signature | X-WebOffice-Signature | 石墨文档中台 用来校验外部请求是否合法 | 某些场景下石墨无法提供 Token,因此你的应用回调接口也需支持通过 X-WebOffice-Signature 校验请求来自石墨 |
| Token | X-WebOffice-Token | 你的应用 校验来自石墨文档中台的请求是否合法 | 携带接入方需要透传的信息,例如用户 id 等 |
具体接口是否携带 Signature或Token,以及携带哪种 / 几种,请查阅对应接口文档。下文给出的是最典型的两种场景。
| 维度 | Signature | Token |
|---|---|---|
| 签发者 | 你的应用(基于 appId、secret 生成) | 你的应用(用自定义业务规则) |
| 校验者 | 石墨文档中台后端; 你的应用后端(仅主动通知场景) | 你的应用后端 |
| 是否携带业务信息 | 否 | 是(可携带用户 id、租户 id 等信息) |
| 生命周期 | 短(一般几分钟到几十分钟,有参数里的 ts 决定) | 你的应用自行决定,建议短期 |
| 主要风险 | 时钟漂移、secret 泄露 | 重放攻击、Token 泄露 |
Signature + Token,再交给石墨 JS SDK;JS SDK 用它们去调石墨,石墨回调你的应用时把 Token 原样带回来。Signature 由你的应用后端签发,前端不持有 secret,避免泄露。Token 由石墨透传回来,你的应用回调接口直接验自己签的内容即可。signature + token,过期了重新换。Token 信息:Signature,由你的应用后端用同一对 appId + secret 来校验请求是否合法。Signature 完成鉴权,不能假设一定能拿到 Token。Signature + Token 双凭证(典型场景)"和"仅 Signature(主动通知)"两种入站方式,按 Header / Credential-Type 自动分支。X-WebOffice-Credential-Type 与 Token 是否存在做分支,不为每种事件单独配 URL。Signature 校验要带 ts。用 appId + secret + ts + nonce 这类参数生成签名,校验时比对计算结果,同时 拒绝 ts 偏离当前时间过大(建议 ±5 分钟)的请求。Token 自己签自己验。Token 是你的应用签发的(JWT / HMAC / 自定义都行),校验只跟你的应用密钥相关。Token 里塞业务上下文(如 userId / tenantId)时记得只放 id 不放敏感数据。401(鉴权信息缺失或无效)/ 403(鉴权通过但业务上拒绝);不要返回 5xx,会让石墨当成自己出问题而无意义重试。co18-03-02-Signature-签名.md)co18-03-03-Token-与回调鉴权.md)appId + secret 写进配置时,按 co18-03-05-安全上线清单.md 的要求保护好密钥。| 误区 | 实际影响 | 正确做法 |
|---|---|---|
在前端持有 secret 直接签 Signature | secret 泄露后整个接入身份被人冒用 | 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,按需刷新 |