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 实现 |