OAuth 2.0详解

OAuth 2.0 是一种主流的授权框架(Authorization Framework),用于让第三方应用安全地访问用户资源,而无需直接暴露用户的账号密码。


一、OAuth2.0 是什么?

OAuth2.0 是一个**“授权”标准协议**,主要用于:

  • 第三方应用 以用户身份安全访问资源
  • 用户可以授权而 无需泄露密码
  • 常用于 Web、移动应用、IoT 的登录与授权

二、角色介绍

角色 说明
Resource Owner 资源拥有者(比如用户本人)
Client 第三方应用程序(比如小红书、微信小程序)
Authorization Server 授权服务器,颁发访问令牌(access_token)
Resource Server 资源服务器,受保护资源的提供者(比如用户的照片、订单信息等)

三、核心流程图

[User]
  ↓ 登录授权
[Authorization Server] <-- Client_ID 验证 --> [Client App]
  ↓
返回授权码 / 令牌
  ↓
[Client] 用 Token 调接口 --> [Resource Server] 返回数据

四、四种授权模式(Grant Types)

1. 授权码模式(Authorization Code)最常用

场景:微信公众号登录、支付宝授权
步骤:
- 浏览器重定向到授权页,用户同意授权
- 返回 code,后端换取 access_token

2. 简化模式(Implicit) 不推荐

场景:前端应用(token 直接返回)
安全性差,逐渐淘汰

3. 密码模式(Resource Owner Password Credentials) 不推荐

场景:用户把用户名密码直接交给 Client(高信任)
现在已不推荐使用

4. 客户端模式(Client Credentials) 第三方系统之间调用

场景:系统对系统,比如 A 服务访问 B 服务 API
步骤:使用 client_id + client_secret 获取 token

五、access_token 和 refresh_token

Token 类型 说明
access_token 访问接口时必须带上的授权令牌,具有有效期
refresh_token 用于在 access_token 失效后刷新新 token
expires_in token 有效期,单位为秒

六、接口示例(客户端模式)

请求 Token:

POST /oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
client_id=client123
client_secret=secret456

返回结果:

{
  "access_token": "abc123xyz",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "read"
}

使用 Token 调用 API:

GET /user/profile
Authorization: Bearer abc123xyz

七、OAuth2.0 的优势

  • 不暴露用户密码
  • 可设定访问范围(Scope)
  • 支持 Token 刷新和失效机制
  • 支持多种授权方式适配不同场景

八、常见应用场景

场景 使用模式
第三方登录(微信、微博) 授权码模式
企业系统之间接口对接 客户端模式
移动端登录 + Token 鉴权 授权码 + Token
内部系统跳转用户免登录 单点登录(SSO)

九、常用 Java OAuth2 实现

技术栈 描述
Spring Authorization Server Spring 官方 OAuth2 Server
Spring Security OAuth(旧) 已弃用,不推荐
Sa-Token OAuth2 Java 国人开发,轻量级 OAuth2 实现

你可能感兴趣的:(#,安全认证鉴权,java)