ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Lore 子仓库认证令牌设计解析:ADR-00003 如何在多子仓库场景下权衡 AuthN 令牌粒度

Lore 子仓库认证令牌设计解析:ADR-00003 如何在多子仓库场景下权衡 AuthN 令牌粒度 版本控制后端【免费下载链接】loreLore is a next-generation, open source version control system项目地址https://gitcode.com/gh_mirrors/lore6/lore点击查看免费下载本篇围绕 Lore 的架构决策记录 ADR-00003docs/developing/decisions/00003-auth-tokens-for-sub-repos.md展开当一个 Lore 仓库由多个拥有独立访问控制的子仓库sub-repository组成时认证数据auth data应当以什么粒度表示。读完本文你能理解该决策的三种候选方案及其取舍逻辑并能在当前代码库中找到与之对应的实现证据——客户端的令牌交换流程、JWT 声明校验以及服务端认证与授权分离的 gRPC 拦截器结构。背景与问题陈述Lore 仓库为了控制对受限内容的访问可以由多个子仓库构成每个子仓库拥有自己的访问控制access controls。在着手设计认证实现细节时团队必须决定认证数据如何表示一个仓库及其所有子仓库的访问关系这正是 ADR-00003 要回答的问题见文档 Context and Problem Statement 一节。决策驱动因素Decision Drivers有四个确保与所有必要的网络传输network transports兼容最小化客户端复杂度最小化服务端复杂度最小化授权验证authorization verification的开销。这四个约束共同指向一个核心矛盾令牌该大而全还是小而多。三种候选方案ADR 完整评估了三种表示认证数据的方式本文完整继承其分析并展开。方案一单个令牌承载整个仓库的全部授权数据在该模型中客户端识别出 CLI 操作会涉及的所有仓库并将标识用户的令牌交换为一个 JWT该 JWT 描述用户对全部仓库的访问权限。ADR 给出了一个关键的容量估算每个仓库约需 18 字节授权数据16 字节仓库 ID 读、写各 1 字节标志位进入 JWT claim 后base64 编码会使数据膨胀到每仓库 24 字节外推到一条命令影响 300 个仓库的退化场景JWT 体量可进入7KB 量级而 HTTP 头部长度的普遍接受上限是8KiB因此未来存在逼近该限制的现实风险。该方案的利弊引自 ADR优点客户端逻辑简单无需请求或切换多个令牌优点QUIC 服务端逻辑简单服务端收到单个令牌即可为连接上的所有流授权优点gRPC 服务端逻辑简单令牌作为每个 gRPC 请求的 metadata 携带并用于授权中性服务端解析数百个仓库授权并高效检索存在一定开销缺点令牌大小可能逼近或超出 HTTP 头部限制。方案二每个仓库一个令牌客户端按需切换选定方案客户端同样先识别出 CLI 操作涉及的所有仓库但不请求覆盖全部仓库的单一 JWT而是为每个仓库各请求一个 JWT。发送 QUIC 请求时客户端会为每个仓库也就是每个令牌建立一条连接但连接内仍可使用多个流streams。该方案的利弊引自 ADR优点QUIC 服务端逻辑简单单个令牌即可为连接上的所有流授权优点gRPC 服务端逻辑简单令牌作为每个 gRPC 请求的 metadata 携带并用于授权优点令牌大小有界bounded优点服务端授权一个请求时无需在未定长的仓库授权列表中检索缺点客户端必须根据操作涉及的仓库数量管理多个令牌与多条连接。方案三令牌仅标识用户服务端独立查授权客户端完全不把令牌交换为仓库级令牌每个被操作的仓库的授权由服务端基于令牌所标识的用户独立验证。优点令牌大小有界优点客户端逻辑简单缺点服务端必须为每条建立连接执行授权逻辑而这可能需要与外部服务协调或以其他形式做 IO 来确认该认证用户被允许做什么。决策结果及其后果ADR 最终选择方案二One auth token per repository, client swaps between auth tokens as necessary。选择理由原文表述为该方式既能处理认证而不破坏 HTTP 用例又能最小化技术栈其他地方的复杂度。决策带来的后果Consequences方向后果Good不存在生成大到超出标准 HTTP 头部限制的认证令牌的风险Good服务端围绕连接认证的逻辑无需改动Good服务端验证认证的开销极小Bad客户端需要为命令涉及的每个子仓库各换取一个令牌在 QUIC 场景下还需为每个令牌各建立一条连接换句话说Lore 把复杂度有意压到了客户端多令牌、多连接的管理以换取服务端在认证热路径上的极简与令牌体量的恒定上界。当前代码库中的实现证据以下实现细节来自当前仓库源码用于印证 ADR 中令牌作为 gRPC 请求 metadata 携带QUIC 连接按令牌建立等设计点如何落地。客户端令牌交换与 JWT 声明校验客户端认证入口在 lore-revision/src/auth/login.rs。其中exchange_token函数将外部令牌交换为 URC 认证令牌随后立即执行verify_jwt_usage_for_remote把解码后的 JWT claims 与目标远程remote的域名做匹配再写入加密令牌存储token_store::store_user_token。with_token则根据token_type区分两条路径lore类型令牌直接校验存储其余类型走交换流程。交互式登录interactive通过clientState 轮询poll_interactive_session默认 30 次、间隔 5 秒完成浏览器登录流。令牌该发给谁的约束由 audience 声明决定。lore-credential/src/jwt.rs 中JWTUserInfo解析iss、sub、aud、exp等标准声明其中aud被定义为根域名列表acceptable_root_domains返回签发者域名 audience 中的根域名合集domain_in_root_domains强制标签边界匹配而非裸后缀匹配——ADR 关联的威胁模型注释见 lore-revision/src/auth.rs 顶部 General Notes for Auth token handling指出攻击者可以搭一个把 Epic 受控 URC Auth 服务声明为认证提供方的恶意仓库诱骗用户把令牌发给自己的服务器因此令牌只应给到令牌 audience 字段列出的域名。domain_in_root_domains通过要求.epicgames.net形式的边界匹配保证evilepicgames.net这类仿冒域名无法通过校验verify_jwt_usage_for_remote在域名不匹配时直接拒绝并记录 forbidding JWT leak。这套机制与 ADR 方案二每个仓库一个有界令牌相配合客户端持有的是面向特定仓库域名的令牌audience 校验则防止令牌被跨域滥用。服务端认证拦截器只做认证授权交给下游ADR 提到gRPC 服务端逻辑简单令牌作为每个 gRPC 请求的 metadata 携带。当前实现中lore-server/src/auth/jwt_interceptor.rs 的JWTInterceptor实现了 tonic 的Interceptor从 metadata 中提取Bearer令牌extract_bearer_token用JwtVerifier验证签名缓存命中走同步热路径block_in_place兜底然后把原始令牌RawToken与解析后的声明AuthorizationToken作为 extensions 插入请求交给下游处理器。该文件内的测试用例明确固化了 ADR 隐含的认证/授权两阶段分离an_authenticated_token_with_no_partition_grant_passes_the_interceptor即使令牌对某分区partition即仓库没有任何授权grant拦截器也放行——分区决策是下游 authorizer 的事a_request_with_no_bearer_token_is_unauthenticated无令牌返回Unauthenticateda_token_failing_on_its_own_claims_is_refused声明自证失败的令牌如过期被拒绝且错误细节不外泄统一返回 Not allowed原因只进日志。真正的仓库级授权发生在authnz层见 lore-server/src/authnz/repository_authorizer.rs、resource_grants_authorizer.rs、global_grants_authorizer.rs等按分区/资源维度检查用户授权。这与 ADR 方案二的授权无需在未定长列表中检索一致——每次请求只对应一个分区授权判断是针对单仓库的。gRPC 请求如何标注针对哪个仓库方案二要求每个请求/连接对应单一仓库代码中这一分区语义由 metadata 键承载。lore-transport/src/grpc/mod.rs 定义了pub const PARTITION_ID_KEY: str lore-partition-bin;存储客户端在发起请求时将该键的二进制值16 字节RepositoryId/Context追加到 metadata 中见 lore-transport/src/grpc/storage_client.rs 中append_bin(PARTITION_ID_KEY, ...)的用法。因此 gRPC 路径上的令牌 分区组合正是 ADR 所描述的令牌作为每个 gRPC 请求的 metadata 携带并用于授权的具体形态令牌负责认证身份lore-partition-bin负责划定该次操作的仓库边界authnz层再做单仓库授权判定。小结ADR-00003 的核心权衡可以概括为一句话用客户端的多令牌/多连接管理成本换取令牌的恒定体量上界与服务端认证热路径的极简。它否定了超大 JWT方案7KB 逼近 8KiB 头部上限的容量风险和服务端逐次查授权方案每条连接引入外部 IO。结合当前源码可以看到该决策落地为三层结构客户端侧的令牌交换与 audience 域名校验lore-revision/src/auth/login.rs、lore-credential/src/jwt.rsgRPC 请求上的lore-partition-bin分区 metadatalore-transport/src/grpc/mod.rs以及服务端认证拦截器与authnz授权层的职责切分lore-server/src/auth/jwt_interceptor.rs、lore-server/src/authnz/。研究 Lore 的认证体系时这条 ADR 是理解为什么令牌这么小、为什么认证和授权分开、为什么每个请求都带分区的关键入口。赞分享版本控制后端【免费下载链接】loreLore is a next-generation, open source version control system项目地址https://gitcode.com/gh_mirrors/lore6/lore点击查看免费下载相关推荐Gitea Actions 令牌权限体系设计多级钳制Clamping、跨仓库访问控制与令牌生命周期解析Gitea Actions 令牌权限体系设计多级钳制Clamping、跨仓库访问控制与令牌生命周期解析 本文基于 Gitea 仓库中的设计文档 token后端代码托管研发协作CI/CDpnpr OCI 仓库级作用域令牌认证oci.bearerAuth 配置完全指南pnpr OCI 仓库级作用域令牌认证 oci.bearerAuth 配置完全指南 导读 本指南围绕 pnprpnpm 仓库自带的 OCI 镜像分发服务新包管理器开发工具CLI如何在Proxmox VE Helper-Scripts中实现API认证令牌的细粒度权限控制完整指南如何在Proxmox VE Helper Scripts中实现API认证令牌的细粒度权限控制完整指南 Proxmox VE Helper ScriptsCo运维虚拟化DevOps上一篇jQuery Mobile查看产品企业解决方案按钮设计指南下一篇Duix.Avatar 完整指南一段10秒视频做出离线AI数字人创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表