OAuth2.0 - 隐藏式授权

746 阅读4分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

隐藏式授权

隐藏式授权类型被用于获取访问令牌access token(它不支持发行刷新令牌refresh token),并对知道操作具体重定向URI的公共客户端进行优化。这些客户端通常在浏览器中使用诸如JavaScript的脚本语言实现。

由于这是一个基于重定向的流程,客户端必须能够与资源所有者的用户代理(通常是Web浏览器)进行交互并能够接收来自授权服务器的传入请求(通过重定向)。

不同于客户端分别请求授权和访问令牌的授权码许可类型,客户端收到访问令牌作为授权请求的结果。

隐藏式许可类型不包含客户端身份验证而依赖于资源所有者在场和重定向URI的注册。因为访问令牌被编码到重定向URI中,它可能会暴露给资源所有者和其他驻留在相同设备上的应用。

流程

     +----------+
     | 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)客户端将用户引导向认证服务器。客户端包括它的客户端标识、请求范围、本地状态和重定向URI,一旦访问被许可(或拒绝)授权服务器将传送用户代理回到该URI

参数说明:

参数参数说明是否必填备注
response_type授权类型必填此处的值必须为token
client_id客户端的ID必填客户端申请时候生成的client_id,有时候会用app_id
redirect_uri重定向URI必填客户端注册时候填写的redirect_uri
scope申请的权限范围可选项
state任意值建议必填认证服务器会原样返回,用于抵制CSRF(跨站请求伪造)攻击

客户端使用HTTP重定向响应向构造的URI定向资源所有者,或者通过经由用户代理至该URI的其他可用方法。

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

授权服务器验证该请求,确保所有需要的参数已提交且有效。如果请求是有效的,授权服务器对资源所有者进行身份验证并获得授权决定(通过询问资源所有者或通过经由其他方式确定批准)。

当确定决定后,授权服务器使用HTTP重定向响应向提供的客户端重定向URI定向用户代理,或者通过经由用户代理至该URI的其他可行方法。

(B)用户决定是否给于客户端授权。

(C)假设用户给予授权,授权服务器将用户导向客户端指定的”重定向URI",并在URI部分包含了访问令牌。

参数说明:

参数参数说明是否必填备注
access_token访问令牌必填
token_type令牌类型必填该值大小写不敏感
expires_in过期时间,单位为秒。可选如果省略该参数,必须其他方式设置过期时间。
scope权限范围可选如果与客户端申请的范围一致,此项可省略。
state任意值建议必填认证服务器会原样返回,用于抵制CSRF(跨站请求伪造)攻击

授权服务器不能颁发刷新令牌。

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

(D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。

(E)资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。

(F)浏览器执行上一步获得的脚本,提取出令牌。

(G)浏览器将令牌发给客户端。

使用场景

  • 适用于所有无Server端配合的应用
  • 如手机/桌面客户端程序、浏览器插件。
  • 基于JavaScript等脚本客户端脚本语言实现的应用。

注意事项

这种方式把令牌直接传回,是很不安全的。因此,只能用于一些安全要求不高的场景,并且令牌的有效期必须非常短,通常就是会话期间(session)有效,浏览器关掉,令牌就失效了。