django项目学习之QQ登录
最近在用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登录的更多相关文章
- Django项目中使用qq第三方登录。
使用qq登录的前提是已经在qq互联官网创建网站应用并获取到QQ互联中网站应用的APP ID和APP KEY 1,建路由 # qq登录 path('loginQq/',qq.loginQq,name=' ...
- 我用Django搭网站(2)-QQ登录
接入QQ登录前,网站需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权. 第一步:准备阶段 打开QQ互联,并登录你的QQ账号.再点击导航上的" ...
- django项目实现第三方github登录
OAuth(开放授权 Open Authorization)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容 ...
- django项目中使用手机号登录
本文使用聚合数据的短信接口,需要先获取到申请接口的appkey和模板id 项目目录下创建ubtils文件夹,定义返回随机验证码和调取短信接口的函数 function.py文件 import rando ...
- django项目学习之异步框架celery
最近用django一个网上商城项目的时候用两个扩展,感觉还不错,所以在此记录一下. 首先来说下celery,celery是一个处理异步任务的框架,需要下载celery包,一般在项目需要进行耗时操作的时 ...
- Django项目中集成第三方登录时出现的错误
原以为是被反爬 没想到 总结:这里的http应该是https协议,以后要更加小心 了,不能犯这种低级错误
- QQ登录的那些坑
这几天在项目上面实现qq登录的功能,当功能做好后发现,同一个qq号登录之后腾讯返回的openid并不一样....(天啦噜啊~)然后查询文档以及咨询客服才知道注册申请时是有一个固定的套路的(不得不说,如 ...
- QQ登录, 腾讯开放平台和QQ互联的坑
原文:QQ登录, 腾讯开放平台和QQ互联的坑 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012881042/article/details/7 ...
- Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid
Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid 上一步获取QQ登录网址之后,测试登录之后本该跳转到这个界面 但是报错了: 新建oauth_callback.html & ...
随机推荐
- springmvc+ajax异步上传图片
1.javaweb传统的上传图片方式就是通过form表单提交 <form action="#" method="post" enctype="m ...
- 【bzoj1059】[ZJOI2007]矩阵游戏
*题目描述: 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N *N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作: ...
- sh_09_print函数的结尾
sh_09_print函数的结尾 # 在默认情况下,print 函数输出内容之后,会自动在内容末尾增加换行 print("*", end="---") prin ...
- [BZOJ4011][HNOI2015]落忆枫音:拓扑排序+容斥原理
分析 又是一个有故事的题目背景.作为玩过原作的人,看题目背景都快看哭了ToT.强烈安利本境系列,话说SP-time的新作要咕到什么时候啊. 好像扯远了嘛不管了. 一句话题意就是求一个DAG再加上一条有 ...
- 函数式接口和Lambda表达式
函数式接口(一般标有@FunctionalInterface)就是只定义一个抽象方法的接口. 一个接口,如果满足函数式接口的定义,那么即使不标注为 @FunctionalInterface, 编译器依 ...
- springboot学习日志(二)-- thymeleaf学习
本次学习如何使用thymeleaf以及相关语法1.在上一章写的那样 引入jar包到maven工程 <dependency> <groupId>org.springframewo ...
- linux 上使用libxls读和使用xlslib写excel的方法简介
读取excel文件:libxls-1.4.0.zip下载地址:http://sourceforge.net/projects/libxls/安装方法: ./configure make make ...
- ffmpeg精简编译
项目上需要用到ffmpeg的接收功能,把rtp流转封装为ts吐udp组播流,不涉及编码,所以需要精简一下脚本如下: #!/bin/bash dir=$(pwd) echo $dir rm -rf $d ...
- MyBaits动态sql语句
1 在接口中书写方法 public interface EmployeeMapperDynamicSQL { public List<Employee> getEmpsTestInnerP ...
- mappers:将sql映射注册到全局配置中
<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 --> <!-- 6.mappers: ...