OAuth 2.0

163 阅读2分钟

概述

OAuth 2.0 是一个行业的标准授权协议。OAuth 2.0 专注于简化客户端开发人员,同时为 Web 应用程序,桌面应用程序,手机和客厅设备提供特定的授权流程。

它的最终目的是为第三方应用颁发一个有时效性的令牌 token。使得第三方应用能够通过该令牌获取相关的资源。常见的场景就是:第三方登录。当你想要登录某个论坛,但没有账号,而这个论坛接入了如 QQ、Facebook 等登录功能,在你使用 QQ 登录的过程中就使用的 OAuth 2.0 协议。

角色

授权协议的流程围绕一些角色展开。

  • 资源拥有者(Resource Owner),即用户,指能够允许访问受保护资源的实体,拥有资源的所有权。如果是个人,被称为end-user。
  • 资源服务器(Resource Server),保存资源拥有者的数据(资源)的服务器。
  • 客户端(Client),使用资源所有者的授权,代表资源所有者发起对受保护资源的请求的应用程序,可以是APP、网页、第三方系统等。
  • 授权服务器(Authorization Server),第三方搭建用于接收资源拥有者(用户)授权的服务器,在获取用户的同意授权后,能够向客户端颁发访问令牌(Access Token),以便客户端获取用户资源。
  • 用户代理(User-agent),帮助资源所有者与客户端沟通的工具。

OAuth 2.0标准化了访问令牌的请求与响应部分。Oauth 2.0的细节在RFC 6749中有详细定义。

协议流程

  1. 客户端请求资源拥有者的授权。
  2. 客户端获得授权许可。
  3. 客户端向授权服务器请求访问令牌。
  4. 授权服务器验证客户端的授权许可,有效则颁发允许访问资源服务器的令牌,令牌具有时效性。
  5. 客户端通过访问令牌向资源服务器请求受保护的资源。
  6. 资源服务器验证客户端的访问令牌,访问令牌有效则响应请求。
     +--------+                               +---------------+
     |        |--(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 ---|               |
     +--------+                               +---------------+

                     Figure 1: Abstract Protocol Flow

授权

客户端需要提供重定向 URI用于在用户授权(或拒绝)应用程序之后重定向用户的地址。

授权类型

OAuth 2.0 提供了四种不同场景下的授权类型。这里我们主要介绍授权码类型(Authorization Code)

授权码模式

授权码模式主要用于第三方登录。

  1. 资源拥有者(用户)选择第三方登录客户端(网页、APP等)。
  2. 客户端重定向到第三方的授权服务器。时客户端携带了客户端标识(client_id),那么第三方就知道这是哪个客户端,资源拥有者确定/拒绝授权后需要重定向到哪里。
  3. 用户确认授权,客户端被重定向到注册时给定的 URI,并携带了第三方给定的 code。
  4. 在重定向的过程中,客户端拿到 code 与 client_id、client_secret 去授权服务器请求令牌,如果成功,直接请求资源服务器获取资源,整个过程,用户代理是不会拿到令牌 token 的。
  5. 客户端(APP)拿到令牌 token 后就可以向第三方的资源服务器请求资源了。
     +----------+
     | 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.

                     Figure 3: Authorization Code Flow

参考