最近在用django框架写一个商城项目(先后端分离),里面用到的一些技术其余项目也能够借鉴,因而就想写一些博客记录,以防本身忘记,今天先写一个关于登陆接口中引入QQ登陆接口的流程。python
关于QQ登陆接口的引入,在qq官方文档有详细说明,网址以下:django
http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0后端
不过该文档中并无python的,须要本身去造轮子,下面我就来记录一下流程。服务器
首先讲一下准备工做,先去QQ提供的第三方接口网站申请一个appid和appkey,关于这两个数据,我没有深刻研究,由于跟个人业务逻辑没什么关联,QQ官方对这两个数据描写以下:app
appid:应用的惟一标识。在OAuth2.0认证过程当中,appid的值即为oauth_consumer_key的值。
appkey:appid对应的密钥,访问用户资源时用来验证应用的合法性。在OAuth2.0认证过程当中,appkey的值即为oauth_consumer_secret的值。框架
而后是具体流程部分:首先来说一下大概的流程,前后端分离
首先来详细讲下第一步,这一步对应QQ官方的文档中的获取Access Token那一步中的第一步,查阅文档,访问的url为https://graph.qq.com/oauth2.0/authorize,固然这里咱们须要一些必填参数,因为请求方式为GET,因此参数只能以查询字符串的形式发送,第一个参数是response_type,固定为code,格式为字符串,第二个参数是client_id,这个须要填写你申请的appid,第三个参数为redirect_uri,该参数需填写成功受权后的回调地址,必须是注册appid时填写的主域名下的地址,建议设置为网站首页或网站的用户中心。注意须要将url进行URLEncode。最后一个参数为state,该参数表示client端的状态值。用于第三方应用防止CSRF攻击,成功受权后回调时会原样带回。在这里咱们用来接收url中的next参数中的数据。访问成功,用户登陆后,会跳转到回调连接,并带上code参数和status参数。
网站
而后是第二步,这一步涉及两个参数的请求,首先是access_token,这一步对应QQ官方的文档中的获取Access Token那一步中的第二步,查阅文档,访问的url为https://graph.qq.com/oauth2.0/token,如上,这里也有一些必填参数,第一个参数为grant_type,默认为“authorization_code”,咱们照填便可,第二个参数为client_id,同第一步,第三个参数为client_secret,这个须要填写你申请的appkey,第四个参数为code,即回调时传过来的code参数,最后一个参数为redirect_uri,同第一步。返回成功后,咱们能够从返回的包中获取到相应的数据,从返回的数据中咱们能够获得access_token的值url
相似:access_token=FE04************************CCE2&expires_in=7776000&refresh_token=88E4************************BE14spa
得到到对应的token后,会在向QQ服务器请求一个openid,这一步对应QQ官方的文档中的获取openid的那一步,访问的url为https://graph.qq.com/oauth2.0/me,这一步只有一个必传参数access_token,即上一步请求获得的token值,返回成功后,会获得如下包数据
callback({"client_id":"YOUR_APPID", "openid":"YOUR_OPENID"})\n; 从该数据能够获得咱们须要的openid,根据对应的openid来返回对应的页面。