3. OAuth2.0 授权模式总览
OAuth 2.0 定义了五种核心授权模式(Grant Types),用于在不同场景下安全地颁发访问令牌(Access )。在 EDI 报文传输的 API 安全实践中,选择正确的授权模式直接决定了系统间的信任边界与权限粒度。以下从流程、适用场景、安全等级三个维度进行系统梳理。
3.1 五种授权模式对比总表
| 授权模式 | 核心流程 | 典型场景 | 安全等级 | EDI 适用性 |
|---|---|---|---|---|
| 授权码模式 | 用户授权 → 授权码 → 令牌 | Web 应用、移动端 | ★★★★★ | 高(推荐用于 B2B 门户) |
| 隐式模式 | 用户授权 → 直接返回令牌 | 纯前端 SPA(已不推荐) | ★★☆☆☆ | 低(不推荐用于 EDI) |
| 密码模式 | 用户名 + 密码 → 令牌 | 受信任的第一方应用 | ★★★☆☆ | 中(仅限内部系统) |
| 客户端凭证模式 | 客户端 ID + Secret → 令牌 | 服务器到服务器、微服务 | ★★★★☆ | 高(推荐用于 EDI 后台) |
| 设备授权模式 | 设备码 → 用户浏览器授权 → 令牌 | IoT、无浏览器设备 | ★★★★☆ | 中(适用于 EDI 边缘设备) |
3.2 授权码模式(Authorization Code Grant)
授权码模式是 OAuth 2.0 中最完整、最安全的授权流程。它通过一个临时的授权码(Authorization Code)作为中间凭证,避免访问令牌直接暴露在用户代理(浏览器)中。该模式要求客户端必须拥有服务端组件,用于安全地交换授权码和令牌。
3.3 隐式模式(Implicit Grant)
隐式模式是授权码模式的简化版本,授权服务器直接返回访问令牌,跳过授权码交换步骤。该模式最初为纯前端应用(SPA)设计,但由于令牌直接暴露在 URL 片段中,存在严重的安全隐患。OAuth 2.1 已正式弃用此模式,建议使用授权码模式 + PKCE 替代。
3.4 密码模式(Resource Owner Password Credentials Grant)
密码模式允许客户端直接使用资源所有者的用户名和密码换取访问令牌。该模式要求客户端高度受信任,通常仅用于第一方应用或迁移场景。在 EDI 集成中,密码模式可用于内部系统间的快速集成,但不应暴露给外部贸易伙伴。
// 密码模式令牌请求示例
POST /oauth/ HTTP/1.1
Host: auth.edi-partner.com
Content-Type: application/x-www-form-urlencoded
grant_type=password
&username=partner_001
&password=EDI@2024Secure!
&client_id=edi_integration_app
&client_secret=confidential_secret_123
3.5 客户端凭证模式(Client Credentials Grant)
客户端凭证模式是 EDI 后台集成中最常用的授权模式。它不涉及用户交互,客户端使用自己的身份凭证(Client ID + Client Secret)直接向授权服务器请求令牌。该模式适用于服务器到服务器(Server-to-Server)的通信场景,如 EDI 报文批量处理、定时任务、微服务间调用。
// 客户端凭证模式令牌请求示例
POST /oauth/ HTTP/1.1
Host: auth.edi-partner.com
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
&client_id=edi_batch_processor
&client_secret=secret_key_2024
&scope=edi:read edi:write
3.6 设备授权模式(Device Authorization Grant)
设备授权模式专为无浏览器或输入受限的设备设计,如 IoT 传感器、工业控制器、EDI 边缘网关。设备首先向授权服务器请求一个设备码(Device Code)和用户码(User Code),用户通过另一台设备的浏览器输入用户码完成授权,设备轮询授权服务器获取令牌。
3.7 授权模式选择决策树
在 EDI 报文传输的 API 安全设计中,可按照以下决策逻辑选择授权模式:
- 是否有用户交互?
- 无用户交互 → 客户端凭证模式(推荐用于 EDI 后台批量处理)
- 有用户交互 → 进入下一步
- 客户端是否有服务端组件?
- 有服务端组件 → 授权码模式(推荐用于 EDI 贸易伙伴门户)
- 纯前端应用 → 授权码模式 + PKCE(替代已弃用的隐式模式)
- 设备是否支持浏览器?
- 不支持浏览器 → 设备授权模式(适用于 EDI 边缘网关)
- 支持浏览器且为受信任内部系统 → 密码模式(仅限内部使用)