Skip to content

Latest commit

 

History

History
93 lines (80 loc) · 4.6 KB

File metadata and controls

93 lines (80 loc) · 4.6 KB

隐式授权模式(Implicit Grant)

简介: 不通过第三方应用程序的服务器,直接在浏览器(User-Agent)中向认证服务器申请令牌,跳过了“授权码”这个步骤,令牌对访问者是可见的。该模式下,access_token容易泄露且不易刷新,适用纯静态页面应用。

流程图:

 +----------+
 | 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 |
 |         |
 +---------+

步骤:

    (A) 客户端将用户导向认证服务器
    (B) 用户决定是否基于客户端授权
    (C) 假设用户给予授权,认证服务器将用户导向客户端事先指定的“重定向URI”(redirection URI),并在URI的Hash部分包含了访问令牌
    (D) 浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值
    (E) 资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌
    (F) 浏览器执行上一步获得的脚本,提取出令牌
    (G) 浏览器将令牌发给客户端

说明

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

示例

GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz
    &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com
(Access Token Response)C步骤中认证服务器回应客户端的 URI,Content-Type为application/x-www-form-urlencoded,包含以下参数:
-- access_token: 必填,令牌
-- token_type: 必填,令牌类型,大小写敏感(bearer或mac,详见[RFC6750](https://tools.ietf.org/html/rfc6750))
-- expires_in: 推荐,令牌过期时间(单位秒)
-- scope: 选填,申请的权限范围
-- state: 必填,自定义状态值

示例:

HTTP/1.1 302 Found
Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA&state=xyz&token_type=example&expires_in=3600

认证服务器一定不能返回 refresh_token

在上面的例子中,认证服务器用HTTP头信息的Location栏,指定浏览器重定向的网址。注意,在这个网址的Hash部分包含了令牌。根据上面的D步骤,下一步浏览器会访问Location指定的网址,但是Hash部分不会发送。接下来的E步骤,服务提供商的资源服务器发送过来的代码,会提取出Hash中的令牌。
(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