3、API认证与授权:API Key机制、OAuth 2.0流程、JWT令牌生成与验证、权限粒度控制

在评分通道API的发布与监控体系中,认证(Authentication)与授权(Authorization)是保障数据安全与合规访问的基石。认证解决“你是谁”的问题,授权解决“你能做什么”的问题。本章将深入剖析四种核心机制:API Key、OAuth 2.0、JWT 以及权限粒度控制,帮助你在不同场景下做出最佳选择。

3.1 API Key 机制:轻量级身份标识

API Key 是最简单的认证方式,通常由服务端生成一个唯一的字符串(如 sk-abc123xyz),客户端在每次请求时通过 Header 或 Query 参数携带。适用于服务端到服务端(M2M)的内部调用或低风险场景。

特性 说明
生成方式 服务端随机生成,通常包含前缀(如 sk-)以标识类型
传递方式 HTTP Header(如 Authorization: Bearer sk-xxx)或 Query 参数
生命周期 永久有效或可设置过期时间,支持手动吊销
适用场景 内部微服务调用、开发测试环境、第三方简单集成
安全风险 泄露后需立即吊销;无法区分用户身份,仅识别应用
最佳实践:API Key 应视为敏感信息,存储在环境变量或密钥管理服务(如 AWS Secrets Manager)中,切勿硬编码在代码仓库中。建议配合 IP 白名单或请求频率限制使用。

3.2 OAuth 2.0 授权流程:标准化的委托授权

OAuth 2.0 是一种授权框架,允许第三方应用在用户授权后,获取有限的资源访问权限。评分通道API推荐使用 授权码模式(Authorization Code Flow) 和 客户端凭证模式(Client Credentials Flow)。

核心角色与流程

  • 资源所有者(Resource Owner):用户,拥有数据访问权。
  • 客户端(Client):第三方应用,请求访问资源。
  • 授权服务器(Authorization Server):负责认证用户并发放令牌。
  • 资源服务器(Resource Server):托管受保护资源,验证令牌。
授权码模式(推荐用于前端+后端应用):
1. 客户端引导用户跳转至授权服务器登录。
2. 用户同意授权后,授权服务器返回授权码(Authorization Code)。
3. 客户端用授权码向授权服务器换取访问令牌(Access Token)和刷新令牌(Refresh Token)。
4. 客户端使用 Access Token 访问资源服务器。
OAuth 2.0 授权码模式流程 用户(资源所有者) 客户端应用 授权服务器 资源服务器 ① 发起请求 ② 请求授权码 ③ 用户登录并授权 ④ 同意授权 ⑤ 返回授权码 ⑥ 授权码 + Client Secret ⑦ 返回 Access Token ⑧ 携带 Access Token 请求资源 ⑨ 返回受保护资源 关键安全点 授权码仅使用一次;Access Token 应设置短有效期(如15分钟);Refresh Token 用于无感续期

3.3 JWT 令牌生成与验证:无状态认证的核心

JSON Web Token(JWT)是一种紧凑的、自包含的令牌格式,常用于 OAuth 2.0 的 Access Token。它由三部分组成:Header、Payload、Signature。

JWT 结构示例

// 编码后的 JWT
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IuW8oOS4iSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTY4MDAwMDAwMCwiZXhwIjoxNjgwMDAzNjAwfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
部分 内容 说明
Header {"alg":"RS256","typ":"JWT"} 声明签名算法(如 RS256、HS256)和令牌类型
Payload {"sub":"1234567890","name":"张三","role":"admin","iat":1680000000,"exp":1680003600} 包含声明(Claims),如用户ID、角色、过期时间
Signature 对 Header 和 Payload 的签名 使用私钥(RS256)或密钥(HS256)生成,防止篡改

JWT 验证流程

  1. 资源服务器从请求中提取 JWT(通常从 Authorization: Bearer <token>)。
  2. 使用公钥(RS256)或密钥(HS256)验证签名是否匹配。
  3. 检查 exp(过期时间)和 nbf(生效时间)等时间声明。
  4. 从 Payload 中提取用户身份和权限信息,用于后续授权判断。
安全警告:JWT 的 Payload 是 Base64 编码而非加密,敏感信息(如密码、信用卡号)严禁放入 Payload。始终使用 HTTPS 传输,防止令牌被中间人截获。

3.4 权限粒度控制:从粗放到精细

权限粒度控制决定了 API 访问的精细程度。评分通道API推荐采用 RBAC(基于角色的访问控制) 与 ABAC(基于属性的访问控制) 相结合的策略。

权限粒度层级对比

粒度级别 描述 示例 适用场景
API 级别 控制能否访问某个 API 端点 允许调用 POST /api/scores 基础权限划分
资源级别 控制能否操作某个具体资源 仅允许读取 GET /api/scores/{userId} 多租户系统
字段级别 控制能否查看或修改某个字段 隐藏 score 字段中的 internalNote 数据脱敏、隐私合规
操作级别 控制具体操作(CRUD) 允许创建评分,禁止删除 精细化权限管理

RBAC + ABAC 组合策略

  • RBAC:定义角色(如管理员、审核员、只读用户),每个角色绑定一组权限。
  • ABAC:在 RBAC 基础上增加动态属性判断,如时间、IP 地址、资源所属部门。
评分通道API权限示例:
- 角色:score_admin → 所有评分 API 的读写权限。
- 角色:score_reviewer → 仅可读取和审核评分,不可修改评分标准。
- ABAC 规则:score_reviewer 在非工作时间(18:00-08:00)只能读取,不能审核。
权限粒度控制架构:RBAC + ABAC 用户 A 用户 B 用户 C RBAC 角色:score_admin RBAC 角色:score_reviewer ABAC 策略引擎 时间:09:00-18:00 IP:内网 / 外网 资源归属:部门匹配 权限决策 允许 / 拒绝 字段过滤 实施建议 在 API 网关层统一执行权限校验;使用策略即代码(Policy as Code)管理 ABAC 规则,便于审计与变更

3.5 四种机制选型对比

机制 认证/授权 状态 安全性 复杂度 推荐场景
API Key 认证 有状态(服务端存储) 低(易泄露) 低 内部服务、开发测试
OAuth 2.0 授权 有状态(授权码) 高 中 第三方应用、用户授权
JWT 认证+授权 无状态 中(依赖签名算法) 中 分布式系统、微服务
RBAC/ABAC 授权 有状态/无状态均可 高 高 多租户、复杂权限场景
推荐组合:评分通道API建议采用 OAuth 2.0(授权码模式) 发放 JWT 作为 Access Token,并在 API 网关层结合 RBAC + ABAC 实现精细权限控制。API Key 仅用于内部健康检查或临时调试。