OAuth2.0标准简析

以第三方接入的视角,讲解OAuth2.0协议。

Authorization Code方式

Authorization Code方式主要涉及用户、第三方和Auth。在官方给到的图中,用户是人,通过UA(一般是浏览器)来交互,第三方是Client,Auth是Authorization Server。

  1. 用户请求第三方的受保护资源,因此第三方会将用户重定向到Auth。这个重定向请求会带着第三方的id、requested scope、local state和一个重定向URI。
  2. 用户通过UA访问Auth的页面进行登录。
  3. 假设登录成功,那么Auth会把UA的页面跳转到之前传给它的重定向URI。这个重定向请求会带上一个authorization code和之前传过来的local state,被发送到第三方的服务器。
  4. 在收到这个请求后,第三方会使用这个code去找Auth要最后的Access Token。需要注意的是,这一次的请求和之前的不同,不都是通过UA的跳转来实现的,而是由第三方的后台单独去请求的。这个请求包含code,用来获取code时传入的重定向URI。并且在另外的协议和通常实现中还要包含secret。
  5. Auth验证第三方code重定向URI。如果验证通过,则返回Access Token。

Implicit方式

URL中的#号称为Flagment。它的一个特性是它会出现在浏览器的地址栏里面,而不会随着HTTP请求发出去。例如下面的URL中,show会出现在GET中,但notshow不会。但在这个页面中,可以通过location.hash来读取notshow的内容。

1
xxx.com/login?show=1#notshow=2

因此这个机制可以实现在跳转前后的两个页面之间传递信息。例如当我们请求Oauth2.0标准的这个页面https://tools.ietf.org/html/draft-ietf-oauth-v2-21#page-20,那么我们实际上是请求https://tools.ietf.org/html/draft-ietf-oauth-v2-21这个URL,然后等页面加载完毕后,这个页面上的内容会读取page-20从而定位到第20页。

1
2
https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=iii&response_type=token&scope=all&redirect_uri=xxx.com/login
http://xxx.com/login?#access_token=yyy&expires_in=7776000

Reference

  1. https://tools.ietf.org/html/draft-ietf-oauth-v2-21#page-20
  2. https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
  3. https://www.chrisyue.com/security-issue-about-oauth-2-0-you-should-know.html