【免费下载链接】proof-sdk
Proof SDK: open-source collaborative editor, provenance model, and agent HTTP bridge
proof-sdk是一个开源的协作编辑器 + 内容溯源模型 + AI Agent HTTP 桥接框架。当你用POST /documents创建一篇共享文档时,响应里会一次性返回两个最重要的凭证:ownerSecret(文档级"主人密钥")和accessToken(按角色限权的访问令牌)。本文将带你从新手视角看懂这套认证模型,并给出 token 安全最佳实践,帮你避免最常见的密钥泄露与越权问题。
一图看懂:ownerSecret 与 accessToken 有什么区别
这两个凭证的职责完全不同,混用是新手最容易犯的错误:
| 维度 | ownerSecret | accessToken |
|---|---|---|
| 定位 | 文档的全权所有者凭证 | 按角色限权的链接凭证 |
| 可用角色 | owner_bot(文档管理员) | viewer/commenter/editor |
| 典型能力 | 暂停、恢复、撤销、删除文档及 owner 级 Agent 操作 | 仅执行该角色范围内的读写操作 |
| 能否创建新 token | 可以 | 仅editor及以上可以 |
| 存放建议 | 服务端安全存储,绝不要展示在前端 UI | 可随分享链接下发给协作方 |
| 源码出处 | 创建文档时randomUUID()生成(server/routes.ts) | 由 server/db.ts 的createDocumentAccessToken签发 |
官方契约文档 AGENT_CONTRACT.md 明确写道:ownerSecret要"安全存储,不要在面向用户的界面中暴露";能使用accessToken完成的操作,就不要动用ownerSecret。
如何获取这两个 token:创建文档的响应字段
调用POST /documents(兼容别名POST /share/markdown)后,响应体中会直接带上全套凭证与链接:
{ "success": true, "slug": "abc123xy", "shareUrl": "https://your-proof.example/d/abc123xy", "tokenUrl": "https://your-proof.example/d/abc123xy?token=...", "ownerSecret": "8b5f...owner secret...", "accessToken": "4d53...link token...", "accessRole": "commenter" }注意几个细节:
accessToken与accessRole是绑定的——同一个 token 只能干它那个角色能干的事;shareUrl是"干净"的无 token 链接,tokenUrl/tokenPath才是带?token=的带凭证链接(兼容与调试用);- 创建响应会一次性把
ownerSecret返回给你,之后只能靠你自己保管,丢失无法从响应里再取。
token 怎么传:服务端认可的 5 种方式
在 server/routes.ts 的getExplicitShareSecret中,服务端按优先级依次接受以下携带方式,方便不同客户端形态接入:
- 请求体字段:
ownerSecret(JSON body) - 请求头:
x-share-token: <token> - 请求头:
x-bridge-token: <token>(Agent 桥接场景) - 查询参数:
?token=<token>(分享链接自带) - Cookie:浏览器访问共享文档时写入的 token cookie
此外Authorization: Bearer <token>也是标准的 bearer 通道(以epsess_开头的托管会话 token 会被排除,避免混淆)。如果你拿到的是一个带?token=的分享链接,官方文档 docs/agent-docs.md 推荐直接:
curl -H "Authorization: Bearer $TOKEN" "http://localhost:4000/documents/$SLUG/state"💡 小技巧:对分享链接本身发
Accept: application/json请求,可以一步拿到文档内容、_links路由和agent.auth使用提示,无需浏览器自动化。
权限模型:四个角色如何解析
上面这张 Proof 共享文档界面(截图来自 public/assets/screenshot.jpg)就是这套认证的最终效果:Agent 与人类在同一界面里评论、建议、协作,而每一步操作都由 token 背后的角色约束。
角色定义在 server/share-types.ts:
viewer < commenter < editor < owner_bot服务端resolveDocumentAccess(server/db.ts)的解析顺序是:
- 提交的凭证先匹配
owner_secret_hash→ 角色owner_bot; - 未命中再查
document_access表中的access token→ 返回其绑定的viewer/commenter/editor角色(未吊销的 token 才有效); - 若请求完全不带 token,产品决策是"slug 本身就是秘密",默认按
editor放行(无 token 的裸链接场景)。
这意味着:token 不只是"能不能进",还决定了"能做什么"——同一个accessToken,viewer只能读,commenter可以评论,editor才能修改内容。
入口鉴权配置:PROOF_SHARE_MARKDOWN_AUTH_MODE
除了文档级 token,proof-sdk 还有一层创建入口的鉴权开关,由环境变量控制(实现见 server/hosted-auth.ts):
| 模式 | 行为 | 适用场景 |
|---|---|---|
none | 开放创建(默认) | 本地开发、内网使用 |
api_key | 必须携带PROOF_SHARE_MARKDOWN_API_KEY(Authorization: Bearer <key>或x-api-key头) | 公网部署 |
oauth_or_api_key | OAuth 或 API Key 二选一 | 托管扩展(SDK 内置 OAuth 不可用,会提示使用 share token 或 API Key) |
auto | 默认解析为none | 兼容旧行为 |
而遗留的POST /api/documents路由则由另一个开关PROOF_LEGACY_CREATE_MODE单独管理(allow/warn/disabled/auto)。
token 安全最佳实践清单
结合源码实现,给出 6 条可直接落地的实践:
ownerSecret只留在服务端。它拥有暂停、恢复、撤销、删除文档的全部权限,应存入密钥管理或数据库,绝不进前端、日志或聊天窗口。- 最小角色原则。给外部协作者签发
accessToken时按需选择viewer/commenter/editor,而不是把ownerSecret发出去"图省事"。 - 善用吊销机制。
revokeDocumentAccessTokens支持按角色批量吊销 token,且会自增access_epoch(server/db.ts),让旧凭证立即失效;POST /documents/:slug/revoke可整体撤销文档访问。 - 警惕 URL 中的 token。
tokenUrl出现在浏览器历史、Referer 与日志里。对外分享优先用干净的shareUrl,token 链接仅在必要时下发。 - 服务端已做哈希存储:所有 token 在数据库中以 SHA-256 哈希保存(
secret_hash),并用 timing-safe 比较校验(server/db.ts 的timingSafeEqualString),防时序侧信道。你的自研接入层也应避免在日志中打印明文 token。 - 变更请求带
Idempotency-Key。重试场景下同一幂等键复用不同 payload 会收到IDEMPOTENCY_KEY_REUSED错误,既保安全又保可重放(契约见 AGENT_CONTRACT.md)。
相关文件导航
- 认证契约与 token 语义:AGENT_CONTRACT.md
- Agent 接入与 token 使用示例:docs/agent-docs.md
- 共享链接与凭证解析路由:server/routes.ts
- token 签发、吊销与角色解析:server/db.ts
- 创建入口鉴权模式:server/hosted-auth.ts
- 角色类型定义:server/share-types.ts
- 官方技能文档:docs/proof.SKILL.md
一句话总结:ownerSecret是钥匙串,accessToken是门禁卡——把钥匙串锁进保险柜,把门禁卡按需发出去,再用好吊销与幂等这两道保险,你的 proof-sdk 共享文档就能既协作又安全。🔐
【免费下载链接】proof-sdk
Proof SDK: open-source collaborative editor, provenance model, and agent HTTP bridge
相关推荐
SPlisHSPlasH数据导出完全指南:Partio与VTK格式深度解析
SPlisHSPlasH数据导出完全指南:Partio与VTK格式深度解析 SPlisHSPlasH是一款强大的开源流体物理模拟库,提供了高效的粒子系统模拟能力
物理引擎图形学科研科学计算企业级权限管理系统架构演进:RuoYi-Vue3跨平台架构迁移实战
企业级权限管理系统架构演进:RuoYi Vue3跨平台架构迁移实战 在数字化转型浪潮中,企业级后台管理系统面临从Web到桌面、从单一平台到多端融合的技术挑战。R
前端企业应用Redis安全配置完全指南:认证、ACL与网络安全最佳实践
Redis安全配置完全指南:认证、ACL与网络安全最佳实践 Redis作为高性能的内存数据库,安全配置是保护数据免受未授权访问的关键。本文将详细介绍Redis的
数据库KV存储缓存
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考