以第三方接入的视角,讲解OAuth2.0协议。
Authorization Code方式
Authorization Code方式主要涉及用户、第三方和Auth。在官方给到的图中,用户是人,通过UA(一般是浏览器)来交互,第三方是Client,Auth是Authorization Server。
- 用户请求第三方的受保护资源,因此第三方会将用户重定向到Auth。这个重定向请求会带着第三方的id、requested scope、local state和一个重定向URI。
- 用户通过UA访问Auth的页面进行登录。
- 假设登录成功,那么Auth会把UA的页面跳转到之前传给它的重定向URI。这个重定向请求会带上一个authorization code和之前传过来的local state,被发送到第三方的服务器。
- 在收到这个请求后,第三方会使用这个code去找Auth要最后的Access Token。需要注意的是,这一次的请求和之前的不同,不都是通过UA的跳转来实现的,而是由第三方的后台单独去请求的。这个请求包含code,用来获取code时传入的重定向URI。并且在另外的协议和通常实现中还要包含secret。
- 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 | https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=iii&response_type=token&scope=all&redirect_uri=xxx.com/login |