2. 鉴权基础理论:认证与授权的区别、常见鉴权模式对比
在构建 OpenAPI 鉴权拦截器之前,必须厘清两个最基础的概念:认证(Authentication)与授权(Authorization)。两者常被混淆,但职责截然不同。同时,理解主流鉴权模式(Basic Auth、Bearer Token、OAuth2、JWT)的底层原理与适用场景,是后续设计拦截规则、选择验证策略的前提。
2.1 认证 vs 授权:核心区别
| 维度 | 认证(Authentication) | 授权(Authorization) |
|---|---|---|
| 核心问题 | 你是谁? | 你能做什么? |
| 目的 | 验证身份真实性 | 授予资源访问权限 |
| 凭证 | 用户名/密码、API Key、证书 | Token、角色、权限策略 |
| 执行顺序 | 先于授权 | 认证通过后执行 |
| 传递方式 | 通常通过请求头或表单 | 通常通过 Token 或 Session |
| 典型失败 | 401 Unauthorized | 403 Forbidden |
工程提示:在 OpenAPI 拦截器中,认证阶段通常由网关或过滤器完成,授权阶段则依赖 Token 中的 scope 或角色信息。拦截器应优先检查认证状态,再执行授权校验,避免未认证请求进入授权逻辑。
2.2 常见鉴权模式对比
四种主流鉴权模式在 API 安全领域各有定位。下表从安全性、复杂度、适用场景三个维度进行横向对比:
| 模式 | 凭证形式 | 安全性 | 实现复杂度 | 典型场景 |
|---|---|---|---|---|
| Basic Auth | Base64(username:password) | 低(明文传输,需配合 HTTPS) | 极低 | 内部调试、简单监控接口 |
| Bearer Token | 不透明 Token 字符串 | 中(依赖 Token 存储与传输安全) | 低 | 服务端生成、客户端携带的通用模式 |
| OAuth2 | Access Token + Refresh Token | 高(支持授权码、客户端凭证等流程) | 高 | 第三方授权、开放平台、微服务间授权 |
| JWT | 自包含 JSON 结构 Token | 中高(签名防篡改,但 Payload 非加密) | 中 | 无状态认证、分布式系统、移动端 API |
避坑提醒:Basic Auth 在非 HTTPS 环境下极易被中间人截获;JWT 虽自带签名,但 Payload 仅 Base64 编码,切勿存放敏感信息(如密码、完整手机号)。OAuth2 流程复杂,建议使用成熟框架(如 Spring Security、OAuth2 Proxy)实现,避免自行造轮子。
2.3 四种模式的核心流程
以下 SVG 图展示了四种鉴权模式在 API 请求中的核心交互流程,帮助理解每种模式在客户端与服务端之间的凭证传递方式:
2.4 JWT 结构详解
JWT(JSON Web Token)是当前微服务架构中最常用的无状态 Token 格式。一个 JWT 由三部分组成,以点号(.)分隔:
// JWT 示例
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
| 部分 | 内容 | 示例(解码后) |
|---|---|---|
| Header | 签名算法、Token 类型 | {"alg":"HS256","typ":"JWT"} |
| Payload | 声明(Claims):用户信息、过期时间等 | {"sub":"1234567890","name":"John Doe","iat":1516239022} |
| Signature | 对 Header + Payload 的签名,防止篡改 | 由密钥和指定算法生成 |
关键认知:JWT 的 Payload 仅 Base64 编码,并非加密。任何持有 Token 的人都可以解码查看内容。因此,敏感信息(如密码、信用卡号)严禁放入 JWT Payload。签名仅保证内容未被篡改,不保证内容不可见。
2.5 OAuth2 四种授权模式
OAuth2 定义了四种授权模式,适用于不同的客户端类型和安全需求:
- 授权码模式(Authorization Code):最安全,适用于有后端的 Web 应用。流程包含授权码交换步骤,Token 不暴露给前端浏览器。
- 隐式模式(Implicit):适用于纯前端应用(如 SPA),直接返回 Access Token。已逐渐被授权码模式 + PKCE 取代。
- 密码模式(Resource Owner Password Credentials):用户直接提供用户名密码给客户端,适用于高度信任的第一方应用。
- 客户端凭证模式(Client Credentials):适用于服务间通信,无需用户参与,客户端使用自己的凭证获取 Token。
以下 SVG 图展示 OAuth2 授权码模式的完整交互流程,这是最常用且最安全的模式:
2.6 鉴权模式选型建议
- 内部调试 / 开发环境:Basic Auth 足够简单,但务必配合 HTTPS。
- 第一方移动端 / SPA:推荐 OAuth2 授权码模式 + PKCE,或使用 JWT 自包含用户信息。
- 服务间通信(B2B):OAuth2 客户端凭证模式,或使用 JWT 进行无状态认证。
- 开放平台 / 第三方集成:OAuth2 授权码模式是行业标准,支持 scope 细粒度授权。
- 无状态分布式系统:JWT 是最佳选择,避免集中式 Session 存储,但需注意 Token 吊销问题。
工程落地提示:在 OpenAPI 鉴权拦截器设计中,建议统一使用 Bearer Token 作为传输方式,底层 Token 格式可以是 JWT 或 OAuth2 颁发的 opaque token。拦截器只需验证 Token 的有效性和 scope,无需关心 Token 的生成方式,保持拦截逻辑与鉴权策略解耦。