Rubygems.org 中 Buildkite OIDC 令牌的 JTI 声明问题解析
2025-07-02 16:35:01作者:羿妍玫Ivan
在 Rubygems.org 项目的 API 密钥角色功能集成过程中,开发团队发现了一个与 Buildkite OIDC 令牌相关的重要兼容性问题。这个问题涉及到现代身份验证协议中的一个关键安全特性——JTI(JWT ID)声明。
问题背景
OIDC(OpenID Connect)是基于 OAuth 2.0 协议的身份验证层,它使用 JWT(JSON Web Token)作为令牌格式。JWT 中包含多个标准声明(claims),其中 JTI 是一个重要的安全声明,用于防止令牌重放攻击。
Rubygems.org 在实现 API 密钥角色功能时,系统要求所有 OIDC 令牌必须包含 JTI 声明。然而,当时 Buildkite 生成的 OIDC 令牌并未包含这一关键声明,导致集成失败。
技术细节分析
Buildkite 是一个流行的持续集成和交付平台。当它作为身份提供者(IdP)时,会颁发包含以下典型声明的 OIDC 令牌:
- iss(签发者):标识令牌的签发机构
- sub(主题):标识令牌的主体
- aud(受众):指定令牌的目标接收方
- 标准时间声明(iat、nbf、exp):定义令牌的生命周期
- 平台特定声明:如组织、流水线、构建信息等
在最初的问题版本中,这些令牌缺少了 JTI 声明,这是一个用于唯一标识 JWT 的声明,对于防止令牌重放攻击至关重要。
解决方案与改进
Buildkite 团队迅速响应,在其 OIDC 令牌实现中添加了 JTI 声明。以下是改进后令牌的典型结构示例(部分字段已脱敏):
{
"iss": "https://agent.buildkite.com",
"sub": "organization:example-org:pipeline:example-pipeline...",
"aud": "rubygems.org",
"iat": 1736757460,
"nbf": 1736757460,
"exp": 1736757760,
"jti": "0194b014-8517-7cef-b232-76a827315f08",
"organization_slug": "example-org",
"pipeline_slug": "example-pipeline",
"build_number": 5,
"build_branch": "main",
"build_commit": "b5ffe3aeea51cec6c41aef16e45ee6bce47d8810",
"job_id": "01945ecf-80f0-41e8-9b83-a2970a9305a1",
"agent_id": "01945ecf-8bcf-40a6-9d70-a765db9a0928"
}
安全意义
JTI 声明的加入显著提升了系统的安全性:
- 防重放攻击:每个令牌都有唯一标识符,服务端可以记录已使用的 JTI 来防止令牌被重复使用
- 审计追踪:为安全事件调查提供了更好的追踪能力
- 符合标准:使实现更符合 JWT 和 OIDC 规范要求
实施建议
对于需要在 CI/CD 流程中使用 OIDC 令牌的开发团队,建议:
- 验证令牌中是否包含必要的安全声明(如 JTI)
- 实现令牌验证时检查 JTI 的唯一性
- 考虑设置适当的令牌有效期(如示例中的 5 分钟)
- 根据实际需求限制令牌的权限范围
这个案例展示了现代身份验证协议实现中细节的重要性,也体现了开源社区通过协作快速解决问题的优势。
登录后查看全文
热门项目推荐
相关项目推荐
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。00
weapp-tailwindcssweapp-tailwindcss - bring tailwindcss to weapp ! 把 tailwindcss 原子化思想带入小程序开发吧 !TypeScript00
CherryUSBCherryUSB 是一个小而美的、可移植性高的、用于嵌入式系统(带 USB IP)的高性能 USB 主从协议栈C00
热门内容推荐
最新内容推荐
Degrees of Lewdity中文汉化终极指南:零基础玩家必看的完整教程Unity游戏翻译神器:XUnity Auto Translator 完整使用指南PythonWin7终极指南:在Windows 7上轻松安装Python 3.9+终极macOS键盘定制指南:用Karabiner-Elements提升10倍效率Pandas数据分析实战指南:从零基础到数据处理高手 Qwen3-235B-FP8震撼升级:256K上下文+22B激活参数7步搞定机械键盘PCB设计:从零开始打造你的专属键盘终极WeMod专业版解锁指南:3步免费获取完整高级功能DeepSeek-R1-Distill-Qwen-32B技术揭秘:小模型如何实现大模型性能突破音频修复终极指南:让每一段受损声音重获新生
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
583
3.95 K
Ascend Extension for PyTorch
Python
413
493
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
360
229
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
69
21
暂无简介
Dart
823
203
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
905
721
昇腾LLM分布式训练框架
Python
125
150
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.42 K
798
React Native鸿蒙化仓库
JavaScript
316
368