Biscuit 授权

Biscuit 是一种新的授权令牌格式,旨在通过支持“衰减”来改进 JWT 和 macaroons——也就是可以离线派生出更受限制、有效期更短的令牌,同时仍能通过公钥验证。评论者讨论了它如何支持能力风格访问控制、委托以及按请求最小化,但也指出撤销仍然需要有状态机制,而且 Biscuit 的生态与规范相比成熟标准还不够成熟。很多人认为,当你需要丰富、去中心化的授权逻辑时,它是一个很有前景的选择;而对于简单、中心化的认证场景,更简单的 JWT 或会话令牌仍然更合适。

概述

  • Biscuit 被介绍为一种能力风格的授权令牌,具备离线衰减、公钥验证,以及嵌入式的基于逻辑的授权语言。
  • 一些评论者认为这个概念“很巧妙”,并且喜欢文档的清晰度,但也指出其中缺少对非高亮权衡的讨论,以及缺少“何时不该使用它”的指导。

与 JWT、OAuth2、Macaroons 的比较

  • JWT:
    • 优点:可简单传递少量声明,支持广泛,无需数据库调用即可轻松验证角色/权限。
    • 缺点:历史上的坑(算法处理、“none” 算法)、与简单的加密会话 cookie 相比复杂度高、攻击面大。
    • Biscuit 试图通过更严格的规范和测试套件来避免 JWT 的问题,但令牌可能更大、验证更慢(每个区块一条签名)。
  • OAuth2:
    • 标准委托是中心化且在线的;无法做到真正的离线衰减/最小化。
    • Biscuit 可以作为一种访问令牌格式与 OAuth/OIDC 集成。
  • Macaroons:
    • 概念上类似(衰减、限制条件),但 macaroons 是抽象的、基于对称密钥的,并且被认为更难实现和使用。
    • Biscuit 增加了具体编码(protobuf)、逻辑语言以及公钥验证。

衰减与委托

  • 离线衰减被普遍视为 Biscuit 最主要的区别点:
    • 从一个强大的令牌出发,持有者可以派生出更受限制的令牌(更小的范围、更短的有效期等),而无需联系 IdP。
    • 被认为对微服务中的按请求最小化和委托特别有用。

撤销与无状态性

  • Biscuit 使用按区块撤销 ID;撤销某个区块会撤销该令牌以及其所有派生令牌。
  • 实际撤销仍然需要状态(撤销列表、缓存),这与 JWT 的根本问题相同。
  • 多位评论者强调,“完全无状态的撤销”是不可能的;最多只能把所需状态集中并尽量减少。

授权语言与策略 DSL

  • Biscuit 类似 Datalog 的语言把事实和检查都放在令牌内部以及验证器一侧。
  • check ifallow if / deny if 之间的区别存在一些困惑,说明它有一定学习曲线。
  • 少数人认为这是一种很有前景的“策略 DSL”方法,可用于描述谁/什么/何时/何地/为何,但也指出存在过度复杂化的风险。

生态、成熟度与实现

  • 已有多个语言的实现,通常通过 Rust 或 WASM 绑定;一些库的进展较慢。
  • 存在符合性测试套件,但规范中的某些部分仍标记为 TODO,边界情况也还在演进。
  • 担忧包括不同库之间行为不一致、用户自定义的运行时限制,以及缺少模糊测试/属性测试。
  • 共识:潜力很强,但生态系统仍在成熟过程中。