1. OAuth2.0 基础:协议概述、授权模式对比与授权码模式适用场景

1.1 OAuth2.0 协议概述

OAuth2.0 是一个授权框架,允许第三方应用在用户授权的前提下,获取对用户资源(如照片、文档、API 数据)的有限访问权限,而无需暴露用户的账号密码。它通过引入访问令牌(Access Token) 和刷新令牌(Refresh Token) 机制,实现了资源所有者(用户)、客户端(第三方应用)、授权服务器与资源服务器之间的安全解耦。

核心角色:
  • 资源所有者(Resource Owner):通常是用户,拥有对受保护资源的控制权。
  • 客户端(Client):需要访问用户资源的第三方应用,如 Web 应用、移动 App 或后端服务。
  • 授权服务器(Authorization Server):负责验证用户身份并颁发访问令牌。
  • 资源服务器(Resource Server):托管受保护资源,使用访问令牌验证请求并返回数据。
OAuth2.0 核心角色与交互流程 资源所有者 (用户) 客户端 (第三方应用) 授权服务器 资源服务器 ① 授权请求 ② 授权码 / 令牌请求 ③ 颁发访问令牌 ④ 携带令牌访问资源

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 换令牌 ⑥ 返回 access_token + refresh_token ⑦ 携带 access_token 请求资源 ⑧ 返回受保护资源 关键安全特性 • 授权码是一次性的,即使被截获也无法直接使用 • 令牌通过后端安全通道交换,不暴露给前端 • 支持 Refresh Token 实现令牌无感续期
常见误区:授权码模式虽然安全,但要求客户端必须有能力安全存储 client_secret。对于纯前端应用(无后端),必须配合 PKCE 扩展使用,否则仍存在授权码拦截风险。在 Go 实现中,建议使用 golang.org/x/oauth2 标准库,它内置了授权码模式和 PKCE 支持。