最近在用django框架写一个商城项目(前后端分离),里面用到的一些技术其他项目也可以借鉴,于是就想写一些博客记录,以防自己忘记,今天先写一个关于登录接口中引入QQ登录接口的流程。

关于QQ登录接口的引入,在qq官方文档有详细说明,网址如下:

http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0

不过该文档中并没有python的,需要自己去造轮子,下面我就来记录一下流程。

首先讲一下准备工作,先去QQ提供的第三方接口网站申请一个appid和appkey,关于这两个数据,我没有深入研究,因为跟我的业务逻辑没什么关联,QQ官方对这两个数据描写如下:

appid:应用的唯一标识。在OAuth2.0认证过程中,appid的值即为oauth_consumer_key的值。
appkey:appid对应的密钥,访问用户资源时用来验证应用的合法性。在OAuth2.0认证过程中,appkey的值即为oauth_consumer_secret的值。

然后是具体流程部分:首先来讲一下大概的流程,

①你需要在登录界面放置一个QQ登录的接口,去请求QQ登录的界面,该接口的功能应该就是拼接一个QQ登录的url,然后通过GET方式去访问QQ登录的界面。

②访问到QQ的登录界面后,用户进行登录,登录完成后,则会跳转到回调地址,请求方式为GET,即你上面填写的redirect_uri,同时会带上两个参数,Authorization Code和status,这里的status就是你填写的status,Authorization Code是QQ服务器生成的一串字符,你可以通过该字符获得access_token(即登录时需要的token值)。获得到对应的token值后,会在对QQ服务器在进行请求,请求方式为GET,请求一个openid。

③根据openid来判断该QQ用户和我们网站的用户是否有关联,在返回相应的页面

首先来详细讲下第一步,这一步对应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的值

类似:access_token=FE04************************CCE2&expires_in=7776000&refresh_token=88E4************************BE14

获得到对应的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来返回对应的页面。

django项目学习之QQ登录的更多相关文章

  1. Django项目中使用qq第三方登录。

    使用qq登录的前提是已经在qq互联官网创建网站应用并获取到QQ互联中网站应用的APP ID和APP KEY 1,建路由 # qq登录 path('loginQq/',qq.loginQq,name=' ...

  2. 我用Django搭网站(2)-QQ登录

    接入QQ登录前,网站需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权. 第一步:准备阶段 打开QQ互联,并登录你的QQ账号.再点击导航上的" ...

  3. django项目实现第三方github登录

    OAuth(开放授权 Open Authorization)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容 ...

  4. django项目中使用手机号登录

    本文使用聚合数据的短信接口,需要先获取到申请接口的appkey和模板id 项目目录下创建ubtils文件夹,定义返回随机验证码和调取短信接口的函数 function.py文件 import rando ...

  5. django项目学习之异步框架celery

    最近用django一个网上商城项目的时候用两个扩展,感觉还不错,所以在此记录一下. 首先来说下celery,celery是一个处理异步任务的框架,需要下载celery包,一般在项目需要进行耗时操作的时 ...

  6. Django项目中集成第三方登录时出现的错误

    原以为是被反爬 没想到 总结:这里的http应该是https协议,以后要更加小心 了,不能犯这种低级错误

  7. QQ登录的那些坑

    这几天在项目上面实现qq登录的功能,当功能做好后发现,同一个qq号登录之后腾讯返回的openid并不一样....(天啦噜啊~)然后查询文档以及咨询客服才知道注册申请时是有一个固定的套路的(不得不说,如 ...

  8. QQ登录, 腾讯开放平台和QQ互联的坑

    原文:QQ登录, 腾讯开放平台和QQ互联的坑 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012881042/article/details/7 ...

  9. Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid

    Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid 上一步获取QQ登录网址之后,测试登录之后本该跳转到这个界面 但是报错了: 新建oauth_callback.html & ...

随机推荐

  1. Type.GetType反射的对象创建Activator.CreateInstance

    /// <summary> /// 获取对应类的实现 /// </summary> /// <param name="libname">< ...

  2. python 面向对象_2

    self的理解 通俗理解self就是实例对象,实例化的是什么,self就是什么 实例变量: 经过实例化才能使用的变量 class Person(): def __init__(self,id,name ...

  3. BZOJ 4373: 算术天才⑨与等差数列 线段树

    Description 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能 ...

  4. 论文阅读:Andromeda: Performance, Isolation, and Velocity at Scale in Cloud Network Virtualization (全文翻译用于资料整理和做PPT版本,之后会修改删除)

    Abstract: This paper presents our design and experience with Andromeda,  Google Cloud Platform’s net ...

  5. VTK 编译过程中出现的hdf5长度(I64)错误解决办法

    最近在使用vtk和cuda做大规模图像处理方面的问题研究,在编译vtk的过程中发现第三方库hdf5不能够解决I64长度的探测识别问题.为了节约大家的时间,现在把我经过实践得到的解决方案共享出来,这里要 ...

  6. linq/EF 使用技巧笔记

    先上图 1.linq列转行(如图从上到下,action_type即power字段),其实严格意义上来说,并不是linq,只是用了循环 List<NavigationDto> leaf = ...

  7. sqli-labs(29)

    0X01 题目说有waf 那我们先来试探一波 ?id=-' union select 1,database(),3%23 成功了 那么他的WAF过滤了什么呐? 这是index.php的源码并没有过滤什 ...

  8. 第四周总结 & 实验报告(二)

    第四周课程总结 一.String类 1.实例化 (1)直接赋值 public class Xxxx{ public static void main(String args[]){ String a ...

  9. jQuery file upload里面的_create的调用和_initEventHandlers的调用

    首先是jquery.ui.widget.js中_createWidget方法内部调用 this._create(); this._trigger( "create", null, ...

  10. MYSQL,分别用一条语句交换两列的值与两行的值

    测试表: CREATE TABLE `test` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, ` DEFAULT CHARSET=utf8 ...