Skip to content

Latest commit

 

History

History
116 lines (97 loc) · 5.56 KB

File metadata and controls

116 lines (97 loc) · 5.56 KB

授权码模式(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)

步骤:

    (A) 用户访问客户端,后者将前者导向认证服务器
    (B) 用户决定是否基于客户端授权
    (C) 假设用户给予授权,认证服务器将用户导向客户端事先指定的“重定向URI”(redirection URI),同时附上一个授权码
    (D) 客户端收到授权码,附上早先的“重定向URI”,向认证服务器申请令牌。这一步是在客户端的后台服务器进行的,对用户不可见
    (E) 认证服务器核对了授权码和重定向URI无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)

说明

(Authorization Request)A步骤中客户端认证的 URI,Content-Type为application/x-www-form-urlencoded,包含以下参数:
-- response_type: 必填且必须为“code”
-- client_id:  必填,客户端ID
-- redirect_uri: 选填,重定向URI
-- scope: 选填,申请的权限范围
-- state: 建议,客户端的当前状态,可以指定任意值,认证服务器会原封不动返回这个值

示例

GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
    &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com
(Authorization Response)C步骤中服务器回应客户端的 URI,Content-Type为application/x-www-form-urlencoded,包含以下参数:
-- code: 必填,授权码。它的有效期应该很短,通常设为10分钟。客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID、重定向URI是一一对应关系
-- state: 如果客户端请求包含这个参数,则服务端应返回一个一模一样的此参数

示例:

HTTP/1.1 302 Found
Location: https://client.example.com/cbcode=SplxlOBeZQQYbYS6WxSbIA&state=xyz
(Error Response)错误的响应,包含以下参数:
-- error: 必填,错误码。以下 ASCII 错误码中的一个
	- invalid_request: 请求参数错误
	- unauthorized_client: 未授权的客户端
	- access_denied: 用户或授权服务器拒绝请求
	- unsupported_response_type: 授权服务器不支持此授权类型
	- invalid_scope: 非法或未知的请求范围
	- server_error: 授权服务器发送错误
	- temporarily_unavailable: 授权服务暂时不可用
-- error_description: 选填,错误提示
-- error_uri: 选填,错误详情地址
-- state: 请求参数中有时才有,且与请求参数值一样

示例:

HTTP/1.1 302 Found
Location: https://client.example.com/cb?error=access_denied&state=xyz
(Access Token Request)D步骤中客户端向认证服务器申请令牌的请求,Content-Type为application/x-www-form-urlencoded,包含以下参数:
-- grant_type: 必填,授权类型,必须为“authorization_cod”
-- code: 必填,上一步拿到的授权码
-- redirect_uri: 必填,重定向URI,与A步骤中此参数值保持一致
-- client_id: 必填,客户端ID

示例:

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
(Access Token Response)E步骤中认证服务器发的HTPP回复,包含以下参数:
-- access_token: 必填,访问令牌
-- token_type: 必填,令牌类型,可以是 bearer 类型或 mac 类型
-- expires_in: 必填,标识过期时间(单位秒),如果不填需用其它方式标识过期时间
-- refresh_token: 选填,更新令牌,用来获取下一令牌
-- example_parameter: 选填,示例额外信息
-- scope: 选填,权限范围,与客户端申请的一致

示例:

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"2YotnFZFEjr1zCsicMWpAA",
  "token_type":"example",
  "expires_in":3600,
  "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
  "example_parameter":"example_value"
}