首页 > 项目 > 当前页面

OAuth2 的四种角色和授权模式运行规则详解

2026-06-13 NEW个对象

📌 OAuth2 的四种角色和授权模式运行规则详解

OAuth2 是目前互联网中最主流的授权框架之一,广泛应用于微信登录、QQ登录、GitHub登录、Google登录、企业SSO统一认证以及微服务认证授权体系中。 很多面试官喜欢问:
  • OAuth2 有哪些角色?
  • 授权码模式流程是什么?
  • 为什么要引入授权码?
  • 为什么授权码模式最安全?
  • 客户端模式和密码模式有什么区别?
如果能够把 OAuth2 的角色模型和四种授权模式讲清楚,基本能够覆盖大部分认证授权面试题。

1️⃣ 问题背景

在传统登录系统中,第三方应用如果想访问用户资源,往往需要直接获取用户账号和密码。

例如某个第三方网站希望读取用户的微信头像、昵称、好友列表,如果采用传统方案,用户需要将微信账号密码直接告诉第三方网站。

⚠️ 这种模式存在巨大风险:
  • 密码泄露风险极高
  • 无法控制授权范围
  • 无法随时取消授权
  • 第三方获得永久访问权限

OAuth2 的核心思想就是: 用户不需要把密码交给第三方应用,而是授权第三方应用获得有限权限访问资源。


2️⃣ 核心原理

OAuth2 本质上是一套授权协议。

用户通过授权服务器完成身份认证后,由授权服务器向客户端颁发 AccessToken,客户端后续携带 Token 访问资源服务器。

核心思想:
账号密码只交给认证中心。
第三方应用只能获得访问令牌(Token)。
资源服务器只认 Token,不认账号密码。

OAuth2整体架构

用户(User) ↓ 客户端(Client) ↓ 授权服务器(Authorization Server) ↓ 获取Access Token ↓ 资源服务器(Resource Server) ↓ 返回资源

3️⃣ 数据结构分析

Token结构

Token通常包含:
  • access_token
  • refresh_token
  • expire_time
  • scope
  • client_id
  • user_id

数据库表设计

client_details id client_id client_secret scope grant_type oauth_access_token token_id user_id client_id access_token expire_time oauth_refresh_token refresh_token user_id expire_time

4️⃣ 算法分析

OAuth2 核心流程实际上是 Token 换取过程。

不同授权模式最大的区别在于: 客户端如何获得 AccessToken。

OAuth2定义了四种授权模式:
  • 授权码模式(Authorization Code)
  • 简化模式(Implicit)
  • 密码模式(Password)
  • 客户端模式(Client Credentials)

5️⃣ 执行流程

🎯 OAuth2 四种角色

角色 说明
Resource Owner 资源拥有者(用户)
Client 客户端(第三方应用)
Authorization Server 授权服务器
Resource Server 资源服务器

🚀 授权码模式(Authorization Code)

这是目前最安全、使用最广泛的授权模式。

用户 ↓ 客户端 ↓ 跳转授权服务器 ↓ 用户登录授权 ↓ 返回Authorization Code ↓ 客户端 ↓ Code换Token ↓ 授权服务器 ↓ 返回AccessToken ↓ 访问资源服务器

为什么需要授权码?

授权码实际上是一个一次性凭证。

浏览器中只暴露 Code,不暴露 Token。 即使 Code 被窃取,没有 ClientSecret 也无法换取 Token。

✅ 授权码模式是 OAuth2 中最安全的模式。

🚀 简化模式(Implicit)

用户 ↓ 客户端 ↓ 授权服务器 ↓ 直接返回Token ↓ 访问资源服务器

省略授权码步骤。

Token直接出现在浏览器URL中。

⚠️ Token容易泄露,目前已经基本淘汰。

🚀 密码模式(Password)

用户 ↓ 输入账号密码 ↓ 客户端 ↓ 授权服务器 ↓ 返回Token

客户端直接收集用户账号密码。

客户端再使用账号密码向授权服务器申请Token。

⚠️ 必须完全信任客户端。

目前主要用于:

  • 企业内部系统
  • 移动APP
  • 自家产品体系

🚀 客户端模式(Client Credentials)

Client ↓ ClientId ClientSecret ↓ 授权服务器 ↓ AccessToken ↓ 访问资源

没有用户参与。

属于机器与机器之间的认证。

常见场景:

  • 微服务调用
  • OpenAPI接口
  • 服务网关认证
  • 定时任务系统

6️⃣ 实际案例

微信扫码登录

1. 用户点击微信登录
2. 跳转微信授权页面
3. 用户扫码确认授权
4. 微信返回Code
5. 服务端使用Code换Token
6. 获取OpenId和用户信息
7. 创建本地用户
8. 登录成功

微信登录本质上使用的就是 OAuth2 授权码模式。

GitHub登录

GitHub第三方登录同样采用 Authorization Code 模式。

用户授权后返回 Code,服务器使用 Code 换取 AccessToken,再读取用户信息。


7️⃣ 优缺点分析

模式 优点 缺点
授权码模式 最安全、支持刷新Token 流程较复杂
简化模式 实现简单 Token暴露浏览器
密码模式 开发简单 需要用户提供密码
客户端模式 适合服务调用 无法代表用户

8️⃣ 面试常见问题

为什么授权码模式最安全?

Token不会经过浏览器。 浏览器中仅存在一次性的 Authorization Code。 攻击者即使截获 Code,也无法获取 ClientSecret。

用户到底授权了什么?

用户授权的是: 允许第三方应用访问自己的资源。

例如:

  • 读取头像
  • 读取昵称
  • 读取邮箱
  • 读取好友列表

用户并没有把密码授权给第三方。

AccessToken与RefreshToken有什么区别?

  • AccessToken用于访问资源
  • RefreshToken用于刷新Token
  • RefreshToken生命周期更长

为什么需要Resource Server?

实现认证与资源解耦。

授权服务器负责发Token。 资源服务器负责验证Token并返回资源。


9️⃣ 总结

OAuth2 四大角色:Resource Owner、Client、Authorization Server、Resource Server。

OAuth2 四种授权模式:授权码模式、简化模式、密码模式、客户端模式。

最常用模式:授权码模式。

第三方登录本质:用户授权第三方访问资源,而不是授权密码。

企业级微服务场景:客户端模式。

微信登录、GitHub登录、QQ登录:授权码模式。

面试高频结论:OAuth2 的核心不是认证,而是授权;授权码模式通过 Code 换 Token 的设计,避免 Token 暴露在浏览器中,因此成为当前互联网系统最主流的 OAuth2 实现方案。

相关文章

  • 如何设计一个亿级系统?

    如何设计一个亿级用户系统?

    NEW个对象 2026-06-11

  • 微信排行榜怎么设计?从单机到亿级用户排行榜架构实践

    排行榜本质上属于实时计算系统,其核心目标是解决海量用户数据的排序、查询、更新和展示问题。随着用户规模从万级增长到亿级,仅依靠数据库排序已经无法满足性能要求,因此通常采用 Redis Sorted Set、缓存分层、异步计算、分库分表等技术实现高性能排行榜。

    NEW个对象 2026-06-09

  • 减库存成功但生成订单失败该怎么办?

    在高并发秒杀系统中,“减库存成功但生成订单失败”是一个典型的分布式一致性问题。该问题通常出现在库存与订单两个独立系统之间的非原子操作场景。

    NEW个对象 2026-06-12

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