OAuth2核心概念

Posted by kyle on September 1, 2019
OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。  
————  阮一峰  

OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。......资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。  
————  《RFC 6749》

OAuth 2.0四种角色

  • 资源所有者:能够授予受保护资源访问权的实体。如果资源所有者是人,他被称为终端用户。
  • 资源服务器:承载受保护资源的服务器,通过访问令牌接受并响应受保护的资源请求。
  • 客户端:代表资源所有者及其授权发出受保护资源请求的应用程序。
  • 授权服务器:成功验证资源所有者并获得授权后,向客户端颁发访问令牌的服务器。

OAuth 2.0四种模式

授权码授权模式(Authorization Code Grant)
     +----------+
     | 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)

基本流程:
1、通过前端渠道,客户获取授权码
2、通过后端渠道,客户使用授权码去交换Access Token和可选的Refresh Token
3、假定资源拥有者客户在不同的设备上
4、最安全的流程,因为令牌不会传递经过User-Agent

内部授权模式(Implicit Grant)
     +----------+
     | Resource |
     |  Owner   |
     |          |
     +----------+
          ^
          |
         (B)
     +----|-----+          Client Identifier     +---------------+
     |         -+----(A)-- & Redirection URI --->|               |
     |  User-   |                                | Authorization |
     |  Agent  -|----(B)-- User authenticates -->|     Server    |
     |          |                                |               |
     |          |<---(C)--- Redirection URI ----<|               |
     |          |          with Access Token     +---------------+
     |          |            in Fragment
     |          |                                +---------------+
     |          |----(D)--- Redirection URI ---->|   Web-Hosted  |
     |          |          without Fragment      |     Client    |
     |          |                                |    Resource   |
     |     (F)  |<---(E)------- Script ---------<|               |
     |          |                                +---------------+
     +-|--------+
       |    |
      (A)  (G) Access Token
       |    |
       ^    v
     +---------+
     |         |
     |  Client |
     |         |
     +---------+

   Note: The lines illustrating steps (A) and (B) are broken into two
   parts as they pass through the user-agent.

基本流程:
1、适用于公开的浏览器单页应用
2、Access Token直接从授权服务器返回(只有前端渠道)
3、不支持Refresh Token
4、假定资源所有者和公开客户应用在同一设备上
5、容易受到中间人攻击

密码凭证授权模式(Password Credentials Grant)
     +----------+
     | Resource |
     |  Owner   |
     |          |
     +----------+
          v
          |    Resource Owner
         (A) Password Credentials
          |
          v
     +---------+                                  +---------------+
     |         |>--(B)---- Resource Owner ------->|               |
     |         |         Password Credentials     | Authorization |
     | Client  |                                  |     Server    |
     |         |<--(C)---- Access Token ---------<|               |
     |         |    (w/ Optional Refresh Token)   |               |
     +---------+                                  +---------------+

基本流程:
1、使用用户名/密码作为授权方式从授权服务器上获取Access Token
2、一般不支持Refresh Token
3、假定资源所有者和公开客户应用在同一设备上

客户端凭证授权模式(Client Credentials Grant)
     +---------+                                  +---------------+
     |         |                                  |               |
     |         |>--(A)- Client Authentication --->| Authorization |
     | Client  |                                  |     Server    |
     |         |<--(B)---- Access Token ---------<|               |
     |         |                                  |               |
     +---------+                                  +---------------+

基本流程:
1、适用于服务期间通信场景,机密客户代表它自己或者一个用户
2、只有后端渠道,使用客户凭证获取一个Access Token
3、因为客户凭证可以使用对称或者非对称加密,该方式支持共享密码或证书

引用:
1、RFC6749
2、OAuth 2.0 的一个简单解释
3、OAuth 2.0 的四种方式
4、《微服务安全架构和实践》微课程