oAuth流程

理解OAuth 2.0第六部分授权码模式的自己的分析。

拿使用qq账户登录百度的流程分析下,打开百度,点击登录,然后有qq的图标,点击下,弹出来一个qq的登录页面(现在是扫描二维码的,这里扫描二维码与输入用户密码效果一样)。先确定几个概念:

点击qq的头像后弹出来的是qq的登录页面,不是百度的,右键属性,查看下url内容如下:

https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=100312028&response_type=code&display=pc&state=1527595241&redirect_uri=https%3A%2F%2Fpassport.baidu.com%2Fphoenix%2Faccount%2Fafterauth%3Fmkey%3D394f6fab6baf65a164c32282a06c94c2&scope=get_user_info,get_other_info,add_t,add_share

分析下这url

输入账户密码后,后面都是腾讯和百度服务器的交互了,看不到交互信息,使用参考文章中的例子,上面是腾讯的页面,输入用户信息后,会发送到认证服务器,然后认证服务器回复的信息可能如下:

HTTP/1.1 302 Found Location: https://baidu.com/cb?code=SplxlOBeZQQYbYS6WxSbIA &state=xyz

然后百度服务器,拿着这个code,并带上自己向腾讯申请的client_secret申请token

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&client_secret=dafsda &redirect_uri=https%3A%2F%2Fclient%baidu%2Ecom%2Fcb

然后腾讯的认证服务器返回token与refresh_token

 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"
 }

这里,还有些步骤,比如百度让校验手机号,其实在百度这边,也会单独新建一个用户,然后这个用户里面大概有个类似第三方账户类型值为腾讯,第三方账户的token与refreshtoken的字段,保存着,用来下次获取数据使用。

为什么要用一个授权码code呢?

主要是出于安全的考虑。假如没有这个code的过程,在弹出的腾讯的页面中,输入用户密码后,腾讯的认证服务器直接返回一个token,然后跳转到另外一个百度的页面,百度的这个页面拿着这个token去获取资源。这里token的交互式式直接与web前端交互的,也就是用户的浏览器,token的信息也是在这里面的,oauth认为这样是不够安全的。其实,用了https,已经比较安全了,但是用不用https,oauth并没有强制规定,也可能是因为不是必须https的,所有才有这种code的方式考虑。

oauth认为什么是比较安全的呢?百度服务器到腾讯服务器之间通讯是安全的,而且一般都是https的。

参考

理解OAuth 2.0
Oauth2.0(五):Authorization Code 授权

Table of Contents