1. OAuth2.0 基础:协议概述、授权模式对比与授权码模式适用场景
1.1 OAuth2.0 协议概述
OAuth2.0 是一个授权框架,允许第三方应用在用户授权的前提下,获取对用户资源(如照片、文档、API 数据)的有限访问权限,而无需暴露用户的账号密码。它通过引入访问令牌(Access Token) 和刷新令牌(Refresh Token) 机制,实现了资源所有者(用户)、客户端(第三方应用)、授权服务器与资源服务器之间的安全解耦。
核心角色:
- 资源所有者(Resource Owner):通常是用户,拥有对受保护资源的控制权。
- 客户端(Client):需要访问用户资源的第三方应用,如 Web 应用、移动 App 或后端服务。
- 授权服务器(Authorization Server):负责验证用户身份并颁发访问令牌。
- 资源服务器(Resource Server):托管受保护资源,使用访问令牌验证请求并返回数据。
1.2 四种授权模式对比
OAuth2.0 根据客户端类型和安全需求,定义了四种授权模式。下表从安全性、适用客户端和令牌获取方式三个维度进行对比:
| 授权模式 | 安全性等级 | 适用客户端类型 | 令牌获取方式 | 是否需要客户端密钥 |
|---|---|---|---|---|
| 授权码模式 | 高 | Web 后端应用、有服务端的 SPA | 先获取授权码,再交换令牌 | 是 |
| 隐式模式 | 中 | 纯前端应用(已不推荐) | 直接返回令牌(URL 片段) | 否 |
| 密码模式 | 低 | 高度信任的第一方应用 | 直接使用用户名密码换取令牌 | 是 |
| 客户端凭证模式 | 高 | 服务器到服务器(无用户参与) | 直接使用客户端凭证换取令牌 | 是 |
最佳实践提示:在 Go 微服务架构中,授权码模式 是面向用户场景的首选;客户端凭证模式 常用于服务间内部 API 调用。隐式模式因安全缺陷已被 OAuth2.1 草案废弃,不应在新系统中使用。
1.3 授权码模式适用场景
授权码模式是 OAuth2.0 中最完整、最安全的授权流程,特别适合以下场景:
- 有后端服务的 Web 应用:客户端拥有安全的服务器端环境,可以安全存储客户端密钥(client_secret)。
- 需要长期访问用户资源的应用:授权码模式支持 刷新令牌(Refresh Token),可以在令牌过期后无感续期。
- 高安全要求的第三方集成:如企业级 SaaS 平台、支付网关、云存储服务等,要求用户授权过程可审计、可撤销。
- 移动端原生应用(配合 PKCE):通过 Proof Key for Code Exchange (PKCE) 扩展,授权码模式也能安全地用于移动 App 和单页应用。
常见误区:授权码模式虽然安全,但要求客户端必须有能力安全存储
client_secret。对于纯前端应用(无后端),必须配合 PKCE 扩展使用,否则仍存在授权码拦截风险。在 Go 实现中,建议使用 golang.org/x/oauth2 标准库,它内置了授权码模式和 PKCE 支持。