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 工具链中的典型协作流程:

OAuth2.0 + OIDC + JWT 协作流程 OAuth2.0 + OIDC + JWT 协作流程 CI/CD 工具(客户端) 认证授权平台 资源服务器(API) ① 请求授权(client_id, scope) ② 返回授权码 ③ 换取令牌(code + client_secret) ④ 返回 Access Token + ID Token(JWT) ⑤ 携带 JWT(Authorization: Bearer) ⑥ 验证 JWT 签名 + Claims ⑦ 返回受保护资源 契约自动校验关键点: • 步骤 ③④:校验 /token 端点响应结构是否包含 id_token、access_token、expires_in • 步骤 ⑤:校验 JWT 的 Header 中 alg 是否与 JWKS 端点匹配 • 步骤 ⑥:校验资源服务器对 JWT 的 aud、exp、iss 的验证逻辑是否与平台一致

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 签名验证逻辑和令牌生命周期管理。