3. 认证授权平台概述:OAuth2.0、OpenID Connect、JWT 等核心协议简介
在构建 CI/CD 流水线时,认证授权平台是保障接口安全的第一道防线。本章将系统梳理 OAuth2.0、OpenID Connect(OIDC)和 JWT 三大核心协议,为后续的契约自动校验奠定理论基础。
3.1 核心协议定位与关系
这三者并非竞争关系,而是分层协作的协议栈:
| 协议 | 核心定位 | 解决的问题 | 典型产出物 |
|---|---|---|---|
| OAuth2.0 | 授权框架 | 第三方应用如何获得资源访问权限 | Access Token |
| OpenID Connect | 身份认证层 | 确认用户是谁,并传递身份信息 | ID Token(JWT 格式) |
| JWT | 令牌格式 | 自包含、可验证的声明传递载体 | JSON Web Token 字符串 |
关键理解: OAuth2.0 管"能做什么"(授权范围),OIDC 管"是谁"(身份认证),JWT 管"怎么装"(令牌格式)。在 CI/CD 流水线中,三者通常组合使用。
3.2 OAuth2.0 授权框架
OAuth2.0 定义了四种授权模式,其中与 API 契约校验最相关的是授权码模式和客户端凭证模式:
- 授权码模式(Authorization Code):适用于有后端的 Web 应用,安全性最高,支持 Refresh Token 轮换。
- 客户端凭证模式(Client Credentials):适用于服务间通信(M2M),CI/CD 流水线中的工具链集成常用此模式。
- 隐式模式(Implicit):已不推荐使用,安全性缺陷明显。
- 密码模式(Resource Owner Password Credentials):仅限高度信任的场景,不推荐用于开放平台。
流水线场景示例: Jenkins 调用 GitLab API 获取代码仓库列表时,使用客户端凭证模式获取 Access Token;用户通过浏览器登录 Jenkins 时,使用授权码模式获取用户身份。
3.3 OpenID Connect 身份认证层
OIDC 在 OAuth2.0 之上增加了身份认证语义,核心产出是 ID Token(JWT 格式)。OIDC 定义了以下关键端点:
| 端点 | 用途 | 契约校验关注点 |
|---|---|---|
/.well-known/openid-configuration |
发现文档,获取所有端点地址 | 响应结构是否符合 OIDC Discovery 规范 |
/authorize |
用户授权请求入口 | 请求参数(scope、redirect_uri)校验 |
/token |
令牌颁发 | 响应中是否包含 id_token、access_token、token_type |
/userinfo |
获取用户信息 | 返回的 Claims 集合与 ID Token 一致性 |
/jwks |
公钥集合,用于验证 JWT 签名 | JWK 格式、密钥轮换策略 |
3.4 JWT 令牌结构
JWT 由三部分组成,以点号分隔:Header.Payload.Signature。在 CI/CD 流水线中,JWT 常用于传递 Access Token 和 ID Token。
// 示例 JWT 结构(解码后)
Header: {
"alg": "RS256",
"typ": "JWT",
"kid": "key-id-2024-01"
}
Payload: {
"iss": "https://auth.example.com",
"sub": "user-12345",
"aud": "jenkins-pipeline",
"exp": 1712345678,
"iat": 1712342078,
"scope": "openid profile email api:read"
}
Signature: [RS256 签名值]
契约校验陷阱: 很多流水线只校验 JWT 签名,却忽略了
aud(受众)和 exp(过期时间)的校验。这会导致令牌被重放到其他服务。契约测试必须覆盖这些声明字段的校验规则。
3.5 协议协作流程
下图展示了 OAuth2.0 + OIDC + JWT 在 CI/CD 工具链中的典型协作流程:
3.6 协议对比与选型建议
| 维度 | OAuth2.0 | OpenID Connect | JWT |
|---|---|---|---|
| 协议层级 | 授权框架 | 身份认证层(基于 OAuth2.0) | 令牌格式标准 |
| 是否必须 | 是(授权场景) | 是(需要用户身份时) | 推荐(自包含、无状态) |
| CI/CD 适用场景 | 工具链授权、API 访问控制 | 用户登录、身份断言 | 令牌传递、声明验证 |
| 契约校验重点 | 授权端点参数、令牌响应结构 | ID Token Claims、UserInfo 端点 | 签名算法、声明字段、过期策略 |
流水线集成建议: 对于 CI/CD 工具链内部通信,优先使用 OAuth2.0 客户端凭证模式 + JWT Access Token;对于需要用户身份的场景(如审批流、人工触发),叠加 OIDC 获取 ID Token。契约测试应覆盖所有端点的请求/响应结构、JWT 签名验证逻辑和令牌生命周期管理。