一、OAuth 2.0 关键点
1. 核心角色
- 用户(Resource Owner) :拥有资源的人,例如你的 Google 账户。
- 客户端(Client) :第三方应用,例如一个博客网站,希望访问你的 Google 相册。
- 授权服务器(Authorization Server) :负责验证用户身份并颁发访问令牌(Access Token),例如 Google 的登录页面。
- 资源服务器(Resource Server) :存储用户资源的服务器,例如 Google 相册。
2. 核心概念
- 访问令牌(Access Token) :客户端使用它来访问用户的资源。
- 授权码(Authorization Code) :客户端通过它换取访问令牌。
- 作用域(Scope) :定义客户端可以访问的资源范围,例如“只读访问”或“读写访问”。
3. 类比
- 用户:你(Resource Owner)。
- 客户端:一个旅行社(Client)。
- 授权服务器:护照签发机构(Authorization Server)。
- 资源服务器:其他国家(Resource Server)。
流程:
- 你想去某个国家旅游(访问资源)。
- 旅行社(客户端)帮你申请签证(访问令牌)。
- 你到护照签发机构(授权服务器)办理签证。
- 护照签发机构验证你的身份后,给你签证(访问令牌)。
- 你拿着签证(访问令牌)进入目标国家(资源服务器)。
二、OAuth 2.0 的工作原理
OAuth 2.0 有四种授权模式,最常用的是 授权码模式(Authorization Code Grant) 。以下是授权码模式的工作流程。
1. 授权码模式的工作流程
(1) 用户访问客户端
- 用户访问客户端应用(例如一个博客网站)。
- 客户端需要访问用户的资源(例如 Google 相册)。
(2) 重定向到授权服务器
- 客户端将用户重定向到授权服务器(例如 Google 的登录页面)。
- 重定向 URL 包含客户端 ID、重定向 URI 和请求的作用域(Scope)。
(3) 用户登录并授权
- 用户在授权服务器上登录并同意客户端的请求。
- 授权服务器生成一个授权码(Authorization Code)并重定向回客户端。
(4) 客户端获取访问令牌
- 客户端使用授权码向授权服务器请求访问令牌(Access Token)。
- 授权服务器验证授权码并返回访问令牌。
(5) 客户端访问资源服务器
- 客户端使用访问令牌访问资源服务器(例如 Google 相册)。
- 资源服务器验证访问令牌并返回请求的资源。
2. 授权码模式的图解
+-------------------+ +-------------------+ +-------------------+
| User | | Client | | Auth Server |
| (Resource Owner)| | (Blog Website) | | (Google) |
+-------------------+ +-------------------+ +-------------------+
| | |
| 1. 访问博客网站 | |
|------------------------->| |
| | |
| 2. 重定向到 Google 登录 | |
|<-------------------------| |
| | |
| 3. 用户登录并授权 | |
|------------------------->| |
| | |
| 4. 返回授权码 | |
|<-------------------------| |
| | |
| 5. 使用授权码获取令牌 | |
|------------------------->| |
| | |
| 6. 返回访问令牌 | |
|<-------------------------| |
| | |
| 7. 使用令牌访问 Google 相册| |
|---------------------------------------------------->|
| | |
| 8. 返回相册数据 | |
|<----------------------------------------------------|
三、OAuth 2.0 的其他授权模式
1. 隐式模式(Implicit Grant)
- 适用于纯前端应用(如单页应用)。
- 直接返回访问令牌,不经过授权码。
2. 密码模式(Resource Owner Password Credentials Grant)
- 用户直接将用户名和密码提供给客户端。
- 适用于高度信任的客户端(如官方应用)。
3. 客户端凭证模式(Client Credentials Grant)
- 客户端使用自己的凭证获取访问令牌。
- 适用于客户端访问自己的资源。