返回文章列表

文章

iroh中ticket的统一认知

目录
  1. 1️⃣ ticket 到底是什么?
  2. 2️⃣ ticket 不是什么(重要)
  3. ❌ 不是一次性凭证(默认)
  4. ❌ 不是授权令牌
  5. ❌ 不是节点发现机制
  6. 3️⃣ ticket 的真实职责边界
  7. iroh 对 ticket 的承诺只有三点:
  8. 4️⃣ ticket 是如何被传递的?
  9. 5️⃣ ticket 泄露会发生什么?
  10. 能发生的:
  11. 不能发生的:
  12. 6️⃣ 为什么 iroh 不把 ticket 设计成一次性的?
  13. 原因一:避免底层引入状态
  14. 原因二:保证连接的可恢复性
  15. 原因三:能力分层原则
  16. 7️⃣ 那“一次性 / 有权限的 ticket”应该怎么做?
  17. 推荐的三层结构:
  18. 示例思路:
  19. 8️⃣ 用一句话精准总结
  20. 📎 参考文章

1️⃣ ticket 到底是什么?#

ticket 不是消息、不是授权令牌、也不是发现协议,而是一个「连接能力描述(capability descriptor)」 更准确地说: ticket = 如何联系到某个 iroh 节点的最小充分信息集合 通常包含:

  • NodeId(公钥,身份)
  • 已知的网络地址(公网 / 内网候选)
  • Relay 信息
  • 协议标识(ALPN / 应用名)

2️⃣ ticket 不是什么(重要)#

❌ 不是一次性凭证(默认)#

  • iroh 不会自动失效 ticket
  • sendme CLI 中 ticket 可被多次使用
  • 是否“一次性”不属于 iroh 的职责

❌ 不是授权令牌#

  • 拿到 ticket ≠ 有业务权限
  • ticket ≠ 密钥
  • ticket 不授予任何“操作权”

❌ 不是节点发现机制#

  • ticket 不能自动帮你“找到对方”
  • 它只在你已经知道“要连谁”时使用

3️⃣ ticket 的真实职责边界#

iroh 对 ticket 的承诺只有三点:#

  1. 身份真实性
    • 连接到的节点一定是该 NodeId 对应的私钥持有者
  2. 连接安全
    • 端到端加密
    • 防中间人
  3. 最大努力直连
    • NAT 打洞
    • 失败自动 relay

❗除此之外的一切语义,都不在 iroh 的职责范围内


4️⃣ ticket 是如何被传递的?#

ticket 永远通过带外信道(out-of-band channel)传递 典型方式包括:

  • UI:二维码 / 复制粘贴
  • 已有服务器:HTTP / WebSocket
  • 第三方平台:IM / 邮件
  • 人工介质:文件 / U 盘 这是一个不可消除的系统引导问题(bootstrapping problem),不是 iroh 特有的问题。

5️⃣ ticket 泄露会发生什么?#

能发生的:#

  • 任意人可以尝试与你建立连接
  • 建立一个加密、安全的通道

不能发生的:#

  • ❌ 解密历史通信
  • ❌ 冒充你的身份
  • ❌ 绕过你协议层的校验
  • ❌ 获取任何业务权限 原因:

ticket 只描述“如何连”,不包含“能做什么”


6️⃣ 为什么 iroh 不把 ticket 设计成一次性的?#

这是一个有意识的架构决策

原因一:避免底层引入状态#

  • 一次性 ticket 必须:
    • 记录使用状态
    • 处理重试 / 并发
  • 与 P2P 的“弱中心 / 无中心”理念冲突

原因二:保证连接的可恢复性#

  • GUI 重试
  • 断线重连
  • 多设备并发
  • relay fallback 这些都会被“一次性 ticket”破坏。

原因三:能力分层原则#

越底层的能力,越不应该包含策略和业务语义 iroh 提供的是:

  • capability(连接能力) 而不是:
  • policy(使用策略)

7️⃣ 那“一次性 / 有权限的 ticket”应该怎么做?#

答案是:在 iroh 之上做

推荐的三层结构:#

┌─────────────────────────┐
│  应用 / 业务层           │ ← 权限 / 一次性 / 授权
├─────────────────────────┤
│  协议层(你定义)        │ ← token / handshake / state
├─────────────────────────┤
│  iroh(传输层)          │ ← 连接 / 加密 / 穿透
└─────────────────────────┘

示例思路:#

  • ticket:只负责“连到我”
  • 首个 stream:
    • 发送一次性 token
    • 校验 / 失效 / 绑定 NodeId
  • 后续才允许业务操作

8️⃣ 用一句话精准总结#

iroh 的 ticket 是「连接能力地址(capability address)」而不是「访问令牌(access token)」。 它解决“如何安全地连到你”,不解决“你是否有权做什么”。


📎 参考文章#