首页 > Spring > 当前页面

认证授权:OAuth2简介及四种授权模型详解

2026-06-11 NEW个对象

📌 认证授权:OAuth2简介及四种授权模型详解

1️⃣ 问题背景

在互联网系统中,认证(Authentication)和授权(Authorization)是最基础也是最重要的安全能力。无论是登录微信、使用GitHub登录第三方网站,还是企业内部系统的单点登录,本质上都涉及身份认证与资源授权。

在早期互联网时代,第三方应用如果需要访问用户资源,往往要求用户直接输入账号密码。例如某个网站希望获取用户邮箱联系人列表,需要用户提供邮箱账号和密码。

这种方式存在巨大安全风险。用户必须将自己的账号密码交给第三方系统,一旦第三方系统被攻击或者泄露数据,用户主系统账号将面临严重安全问题。

⚠️ 传统模式问题: 用户密码暴露给第三方应用,主系统无法控制权限范围,也无法进行细粒度授权管理。

为了彻底解决这一问题,OAuth协议应运而生。OAuth的核心目标就是让第三方应用在不获取用户密码的情况下访问用户授权资源。

目前主流互联网平台如微信开放平台、GitHub开放平台、支付宝开放平台、Google账号体系以及企业级统一身份认证系统,几乎全部采用OAuth2协议作为授权标准。

✅ 核心价值: OAuth2解决的是第三方应用如何安全访问用户资源的问题,而不是用户登录问题。

2️⃣ 核心原理

OAuth2是一套授权框架,而不是具体实现产品。它定义了一套标准协议,用于规范客户端如何获取访问资源的权限。

OAuth2主要涉及四种角色。

OAuth2四大角色

  • Resource Owner(资源拥有者)
  • Client(客户端应用)
  • Authorization Server(授权服务器)
  • Resource Server(资源服务器)
用户(Resource Owner)
↓ 授权
↓ 授权服务器(Authorization Server)
↓ 签发Access Token
↓ 客户端(Client)
↓ 携带Token访问
↓ 资源服务器(Resource Server)

OAuth2最大的特点是引入Token机制。

客户端获取的是访问令牌(Token),而不是用户密码。

资源服务器只需要校验Token是否合法即可决定是否放行。

💡 OAuth2核心思想: 密码不再传递给第三方系统,而是由授权服务器统一管理身份认证,并向客户端签发有限权限的访问令牌。

3️⃣ 数据结构分析

Access Token结构

OAuth2最核心的数据对象就是Access Token。

access_token
token_type
expires_in
scope
refresh_token

典型返回结果:

access_token=eyJhbGciOiJIUzI1NiJ9...
token_type=Bearer
expires_in=7200
scope=user_info

JWT Token结构

现代OAuth2通常结合JWT实现无状态认证。

Header
↓ Payload
↓ Signature

JWT内部通常包含用户ID、角色、权限以及过期时间等信息。

授权码结构

authorization_code

授权码模式中,客户端首先获得授权码,然后再换取Access Token。

授权码通常具有一次性和短生命周期特点。

4️⃣ 算法分析

OAuth2授权本质

OAuth2本质上是一种令牌交换机制。

用户身份
↓ 授权服务器验证
↓ 生成Token
↓ 客户端持有Token
↓ 访问资源

整个过程中密码始终保留在授权服务器。

第三方应用永远无法获取用户密码。

Token校验算法

接收Token
↓ 校验签名
↓ 校验过期时间
↓ 校验Scope
↓ 校验用户状态
↓ 返回授权结果

资源服务器通过上述流程完成访问控制。

5️⃣ 执行流程

第一种:授权码模式(Authorization Code)

✅ 当前最安全、最推荐使用的模式

适用于Web网站、企业系统、开放平台登录等场景。

用户访问客户端
↓ 跳转授权服务器
↓ 用户登录授权
↓ 返回Authorization Code
↓ 客户端后台换取Token
↓ 获得Access Token
↓ 访问资源服务器

整个过程中Token不会暴露给浏览器,因此安全性最高。

第二种:简化模式(Implicit)

主要用于纯前端应用。

用户授权
↓ 直接返回Token
↓ 浏览器获取Token
↓ 访问资源服务器

由于Token直接暴露给浏览器,因此存在安全隐患。

⚠️ OAuth2.1已经废弃Implicit模式。

第三种:密码模式(Password)

客户端直接收集用户名密码。

用户名密码
↓ 授权服务器
↓ 签发Token
↓ 访问资源服务器

虽然实现简单,但违背OAuth设计初衷。

目前已经逐渐被淘汰。

第四种:客户端模式(Client Credentials)

适用于服务与服务之间调用。

ClientId
ClientSecret
↓ 授权服务器
↓ Token
↓ 访问API

例如订单服务调用用户服务。

无需用户参与。

6️⃣ 实际案例

案例一:微信扫码登录

微信登录本质上采用授权码模式。

扫码
↓ 微信授权
↓ 返回Code
↓ 后台换取Token
↓ 获取用户信息

这是OAuth2最经典应用场景。

案例二:GitHub登录

第三方网站允许用户使用GitHub账号登录。

网站不会知道GitHub密码。

仅获得授权Token。

案例三:Spring Authorization Server

现代微服务系统通常部署独立认证中心。

认证中心
↓ JWT签发
↓ Gateway网关
↓ 微服务集群

网关统一验证Token。

后端服务无需重复登录认证。

案例四:企业SSO单点登录

企业内部系统统一接入OAuth2认证中心。

员工登录一次即可访问多个系统。

实现统一认证与统一授权。

7️⃣ 优缺点分析

OAuth2优势

✅ 优点
  • 无需暴露用户密码
  • 支持细粒度授权
  • 支持第三方登录
  • 支持单点登录SSO
  • 支持微服务认证体系
  • 支持Token续期机制
  • 支持统一身份管理
  • 扩展能力强

OAuth2缺点

❌ 缺点
  • 实现复杂度较高
  • Token管理成本增加
  • 需要授权服务器支持
  • Token泄露存在风险
  • 涉及较多安全配置

四种模式对比

💡 推荐等级:

授权码模式:★★★★★
客户端模式:★★★★★
密码模式:★★
简化模式:★(已淘汰)

8️⃣ 面试常见问题

面试题1:OAuth2解决什么问题?

OAuth2解决第三方应用如何安全访问用户资源的问题,实现授权而非认证。

面试题2:OAuth2和JWT有什么区别?

OAuth2是授权框架,JWT是Token格式,两者经常结合使用。

面试题3:为什么授权码模式最安全?

因为Token在服务端交换,不会暴露给浏览器,攻击面最小。

面试题4:Refresh Token作用是什么?

用于在Access Token过期后重新获取新的Token,无需用户重新登录。

面试题5:OAuth2和SSO有什么关系?

OAuth2是实现SSO的重要技术基础,但SSO属于更高层次的认证体系。

面试题6:现代微服务推荐使用哪种模式?

用户登录推荐授权码模式,服务间调用推荐客户端模式。

9️⃣ 总结

OAuth2已经成为现代互联网统一认证授权体系的事实标准。从微信登录、GitHub登录到企业级SSO平台,再到微服务认证中心,其底层思想都离不开OAuth2协议。

OAuth2最大的贡献在于通过Token机制将用户身份与第三方应用彻底解耦,实现安全、灵活且可扩展的授权体系。

✅ OAuth2核心架构总结

用户
↓ 授权服务器
↓ Authorization Code
↓ Access Token
↓ Resource Server
↓ 访问受保护资源

授权码模式 → 用户登录首选
客户端模式 → 微服务调用首选
密码模式 → 逐渐淘汰
简化模式 → 已废弃

对于Java开发工程师而言,OAuth2已经成为认证授权领域的必备技能。在实际项目中,通常会结合Spring Security、Spring Authorization Server、JWT、Gateway以及微服务架构共同构建完整的统一身份认证平台。从面试角度来看,理解OAuth2四种授权模型、Access Token与Refresh Token机制、JWT无状态认证以及SSO实现原理,是后端架构岗位的核心能力之一。

相关文章

  • Spring security的执行流程

    Spring Security 的执行流程: 1、认证(Authentication):先经过认证过滤器 -> 认证管理器 -> 成功后存入 SecurityContextHolder 2、授权(Authorization):访问资源时经过授权过滤器 -> 权限判断 -> 允许访问或拒绝访问 3、所有请求都经过 SecurityFilterChain 过滤

    NEW个对象 2025-02-27

  • Nacos与Eureka如何选择?

    1、Nacos支持AP和CP两种模式,Eureka仅支持AP,如果对数据一致性要求比较高,选择nacos。 2、Nacos支持多语言,比如:java、python、go等,Eureka仅支持java 3、Nacos是Spring alibaba的组件,Eureka是Netflix的组件。 4、Nacos 不仅提供服务注册与发现,还提供配置管理、动态 DNS 服务等。

    NEW个对象 2024-12-30

  • 搭建Spring Boot项目的基础架构

    搭建Spring Boot项目的基础架构

    NEW个对象 2024-10-03

NEW个对象 NEW个对象
JAVA是世界上最好的语言