认什么是 OAuth2

5/17/2022 后端Spring

目录:


参考链接:https://www.cnblogs.com/crazymakercircle/p/14488160.html (opens new window)


# 什么是OAuth2 ?

​ OAuth2 是一个授权(Authorization)协议,是一个关于授权的开放标准。核心思路是通过各类认证手段认证用户身份,并颁发令牌(token),使得第三方应用可以使用该令牌在限定时间、限定范围访问指定资源。获取令牌的方式主要有四种,分别是**授权码模式简单模式密码模式客户端模式**,

​ OAuth2 主要涉及的RFC规范有【RFC6749(整体授权框架)】、【RFC6750(令牌使用)】、【RFC6819(威胁模型)】这几个,一般我们需要了解的就是**RFC6749**。

下面这张图来源于 OAuth 2.0 authorization framework RFC Document (opens new window),是OAuth2的一个抽象流程。

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

名词理解:

  • Resource Owner:资源所有者,即用户
  • Client:客户端应用程序(Application)
  • Authorization Server:授权服务器
  • Resource Server:资源服务器

流程理解:

(A) 用户连接客户端应用程序以后,客户端应用程序要求用户给予授权;

(B) 用户同意给予客户端应用程序授权(Grant);

(C) 客户端应用程序使用上一步获得的授权(Grant),向授权服务器申请令牌(Token);

(D) 授权服务器对客户端应用程序的授权(Grant)进行验证后,确认无误,发放令牌(Token);

(E) 客户端应用程序使用令牌(Token),向资源服务器申请获取资源;

(F) 资源服务器确认令牌(Token)无误,同意向客户端应用程序开放资源。

关键:获取授权(Grant)

# OAuth2 的授权类型

  • Authorization Code(授权码模式):

功能最完整、流程最严密的授权模式。通过第三方应用程序服务器与认证服务器进行互动。广泛用于各种第三方认证。

  • Implicit(简化模式):

不通过第三方应用程序服务器,直接在浏览器中向认证服务器申请令牌,更加适用于移动端的App及没有服务器端的第三方单页面应用。

  • Resource Owner Password(密码模式):

用户向客户端服务器提供自己的用户名和密码,用户对客户端高度信任的情况下使用,比如公司、组织的内部系统,SSO。

  • Client Credentials(客户端模式):

客户端服务器以自己的名义,而不是以用户的名义,向认证服务器进行认证。

最常用的 Resource Owner Password(密码模式)和 Authorization Code(授权码模式)。此外,还有一个模式叫 Refresh Token,以下介绍:

# Resource Owner Password(密码模式)

     +----------+
     | Resource |
     |  Owner   |
     |          |
     +----------+
          v
          |    Resource Owner
         (A) Password Credentials
          |
          v
     +---------+                                  +---------------+
     |         |>--(B)---- Resource Owner ------->|               |
     |         |         Password Credentials     | Authorization |
     | Client  |                                  |     Server    |
     |         |<--(C)---- Access Token ---------<|               |
     |         |    (w/ Optional Refresh Token)   |               |
     +---------+                                  +---------------+

            Figure : Resource Owner Password Credentials Flow
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

步骤如下:

(A) 用户(Resource Owner)向客户端(Client)提供用户名和密码。

(B) 客户端将用户名和密码发给认证服务器(Authorization Server),向后者请求令牌(Token)。

(C) 认证服务器确认无误后,向客户端提供访问令牌(Token)。

# Authorization Code(授权码模式)

     +----------+
     | Resource |
     |   Owner  |
     |          |
     +----------+
          ^
          |
         (B)
     +----|-----+          Client Identifier      +---------------+
     |         -+----(A)-- & Redirection URI ---->|               |
     |  User-   |                                 | Authorization |
     |  Agent  -+----(B)-- User authenticates --->|     Server    |
     |          |                                 |               |
     |         -+----(C)-- Authorization Code ---<|               |
     +-|----|---+                                 +---------------+
       |    |                                         ^      v
      (A)  (C)                                        |      |
       |    |                                         |      |
       ^    v                                         |      |
     +---------+                                      |      |
     |         |>---(D)-- Authorization Code ---------'      |
     |  Client |          & Redirection URI                  |
     |         |                                             |
     |         |<---(E)----- Access Token -------------------'
     +---------+       (w/ Optional Refresh Token)

   Note: The lines illustrating steps (A), (B), and (C) are broken into
   two parts as they pass through the user-agent.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

步骤如下:

(A) 用户(Resource Owner)通过用户代理(User-Agent)访问客户端(Client),客户端索要授权,并将用户导向认证服务器(Authorization Server)。

(B) 用户选择是否给予客户端授权。

(C) 假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。

(D) 客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

(E) 认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。这一步也对用户不可见。

# Refresh Token(令牌刷新模式)

  +--------+                                           +---------------+
  |        |--(A)------- Authorization Grant --------->|               |
  |        |                                           |               |
  |        |<-(B)----------- Access Token -------------|               |
  |        |               & Refresh Token             |               |
  |        |                                           |               |
  |        |                            +----------+   |               |
  |        |--(C)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(D)- Protected Resource --| Resource |   | Authorization |
  | Client |                            |  Server  |   |     Server    |
  |        |--(E)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(F)- Invalid Token Error -|          |   |               |
  |        |                            +----------+   |               |
  |        |                                           |               |
  |        |--(G)----------- Refresh Token ----------->|               |
  |        |                                           |               |
  |        |<-(H)----------- Access Token -------------|               |
  +--------+           & Optional Refresh Token        +---------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

当我们申请token后,Authorization Server 不仅给了我们 Access Token,还有 Refresh Token。

当 Access Token 过期后,我们用 Refresh Token 访问 /refresh 端点就可以拿到新的 Access Token 了。

上次更新时间: 9/4/2023, 7:55:06 PM