OAuth2协议核心概念:资源所有者、客户端、授权服务器、资源服务器、访问令牌、刷新令牌

说实话,OAuth2这六个核心概念,我当年刚接触时也绕晕过。你想想看,又是资源所有者,又是客户端,还有一堆服务器和令牌,到底谁跟谁打交道?

别急,咱们一个一个拆开讲。我习惯用一个生活场景来理解——你去酒店开房。

  • 就是资源所有者,你拥有自己的身份信息
  • 酒店前台就是客户端,它需要验证你的身份
  • 公安局系统就是授权服务器,它负责核验身份证真伪
  • 酒店房间就是资源服务器,它只认房卡不认人
  • 房卡就是访问令牌,拿着它就能开门
  • 前台给你的临时凭证就是刷新令牌,房卡过期了可以换新的

嗯,这个比喻虽然简单,但核心逻辑全在里面了。咱们下面细说。

资源所有者(Resource Owner)

资源所有者,说白了就是数据的真正主人。在OAuth2协议里,它通常是一个用户,拥有对某些受保护资源的访问权限。

我在项目中遇到过一种情况:很多新手以为资源所有者就是"用户"两个字就完了。其实不然。资源所有者可以是人,也可以是系统。比如一个微服务调用另一个微服务的API,那个被调用的服务就是资源所有者。

关键点:资源所有者是授权决策的最终执行者。没有它的同意,谁也拿不到令牌。

客户端(Client)

客户端是代表资源所有者发起请求的应用程序。它可以是Web应用、移动App、桌面软件,甚至是另一个服务。

我习惯把客户端分成两类:

  • 机密客户端:能安全保存密钥,比如后端服务
  • 公开客户端:无法安全保存密钥,比如浏览器里的JS应用

你想想看,一个纯前端应用把client_secret写在代码里,那跟把密码贴在门上有什么区别?

注意:公开客户端绝对不能使用授权码流程中的client_secret。我曾经见过有人把密钥硬编码到移动App里,结果被反编译后全网公开——那叫一个惨。

授权服务器(Authorization Server)

授权服务器是整个OAuth2体系的核心枢纽。它负责:

  1. 验证资源所有者的身份
  2. 获取资源所有者的授权
  3. 颁发访问令牌和刷新令牌

在Spring Security生态里,授权服务器通常就是Spring Authorization Server。我记得第一次配置时,光client_id和client_secret的存储方式就折腾了半天。后来发现,其实授权服务器最核心的就两件事:认证授权

小技巧:授权服务器可以跟资源服务器部署在一起,也可以分开。我建议生产环境分开部署,这样授权服务器挂了不会影响已颁发的令牌使用。

资源服务器(Resource Server)

资源服务器是真正存储和保护用户数据的地方。它不关心你是谁,只关心你拿的令牌是否有效。

资源服务器的工作流程其实很简单:

  • 收到请求 → 检查令牌 → 验证权限 → 返回数据

我在项目中遇到过一个问题:资源服务器每次请求都去授权服务器验证令牌,导致授权服务器压力巨大。后来我们引入了本地令牌校验,用JWT格式的令牌,资源服务器自己就能验证签名,完全不需要远程调用。

核心原则:资源服务器只认令牌,不认人。它跟授权服务器之间是松耦合关系。

访问令牌(Access Token)

访问令牌是客户端访问受保护资源的凭证。它通常是一个字符串,有时是JWT格式,有时是透明字符串。

访问令牌有几个关键特性:

特性 说明
短期有效 通常15分钟到1小时,减少泄露风险
作用域受限 只能访问授权范围内的资源
不可撤销 一旦颁发,在有效期内无法主动失效(除非黑名单)

你想想看,如果访问令牌有效期设成一个月,那泄露了怎么办?所以OAuth2设计成短期令牌+刷新令牌的组合,既安全又方便。

避坑指南:我曾经见过有人把用户密码直接放在访问令牌里。千万别这么做!令牌里只放必要信息,比如用户ID、作用域、过期时间。敏感信息一律不放。

刷新令牌(Refresh Token)

刷新令牌是用来获取新的访问令牌的凭证。它比访问令牌生命周期长得多,可能几天甚至几个月。

刷新令牌的设计初衷很简单:

  • 访问令牌短命 → 安全
  • 刷新令牌长命 → 用户体验好
  • 两者配合 → 既安全又方便

我习惯把刷新令牌叫做"后悔药"。访问令牌过期了怎么办?拿刷新令牌去换一个新的就行,用户完全无感知。

重要提醒:刷新令牌必须安全存储。如果刷新令牌泄露,攻击者可以持续获取新的访问令牌。在Spring Security中,刷新令牌默认是存储在授权服务器端的,客户端只保存一个引用。

六个概念的关系图

咱们用文字描述一下它们之间的交互流程:

  1. 资源所有者告诉客户端:我想访问我的数据
  2. 客户端把资源所有者引导到授权服务器
  3. 资源所有者在授权服务器上登录并授权
  4. 授权服务器给客户端一个授权码
  5. 客户端用授权码去授权服务器换访问令牌和刷新令牌
  6. 客户端拿着访问令牌去资源服务器拿数据
  7. 访问令牌过期后,客户端用刷新令牌换新的

嗯,这个流程你多看几遍,OAuth2的核心就全在这里了。我在项目中调试过无数次这个流程,每次出问题基本都是某个环节的配置没对上。

个人经验:刚开始学OAuth2时,我建议你先把这六个概念画成一张图,贴在工位上。每次遇到问题就往这张图上套,很快就能找到问题出在哪个环节。

好了,这一章的内容就到这里。下一章咱们会深入讲授权码模式,这是OAuth2最常用也最安全的授权方式。到时候我会带着你一步步实现一个完整的授权码流程。