Django项目中实现使用qq第三方登录功能


Posted in Python onAugust 13, 2019

使用qq登录的前提是已经在qq互联官网创建网站应用并获取到QQ互联中网站应用的APP ID和APP KEY

1,建路由

#  qq登录
 path('loginQq/',qq.loginQq,name='loginQq/'),
 path('returns/',qq.returns,name='returns/'),

2,前端页面写qq登录的链接,本文没有用图标,暂时使用a链接请求。

<a data-wow-delay=".5s" href="/blog/loginQq/" rel="external nofollow" > » QQ登录</a>

3,在项目的应用下创建utils文件夹并创建function.py用于封装函数,封装的函数用于从返回数据中提取openid(腾讯公司数据库里面的用户id)

Django项目中实现使用qq第三方登录功能

封装的函数内容如下;

import re
def parse_jsonp(jsonp_str):
 try:
  return re.search('^[^(]*?\((.*)\)[^)]*$', jsonp_str).group(1)
 except:
  raise ValueError('无效数据!')

4,后台代码

from django.shortcuts import render,redirect,HttpResponse,HttpResponseRedirect
from blog.models import Member
from urllib import parse
from urllib import request as req
import re
import json
import random
from blog.utils import function
def loginQq(request):
 state = str(random.randrange(100000,999999)) # 定义一个随机状态码,防止跨域伪造攻击。
 request.session['state'] = state # 将随机状态码存入Session,用于授权信息返回时验证。
 client_id = '101716344' # QQ互联中网站应用的APP ID。
 # 对回调地址进行编码,用户同意授权后将调用此链接。
 callback = parse.urlencode({'redirect_uri':'http://127.0.0.1:8000/blog/returns'}) #redirect_uri=http%3A%2F%2F127.0.0.1%3A8000%2Fblog%2Freturns
 # 组织QQ第三方登录链接
 login_url = 'https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=%s&%s&state=%s'%(client_id,callback,state)
 return HttpResponseRedirect(login_url) # 重定向到QQ第三方登录授权页面
def returns(request):
 if request.session['state'] == request.GET['state']: # 验证状态码,防止跨域伪造攻击。
  code = request.GET['code'] # 获取用户授权码
  client_id = '101716344' # QQ互联中网站应用的APP ID。
  client_secret = '7f42aaac69f866750078fbe1edd9d2a4' # QQ互联中网站应用的APP Key。
  callback = parse.urlencode({'redirect_uri': 'http://127.0.0.1:8000/blog/returns'})
  # 对回调地址进行编码,用户同意授权后将调用此链接。
  login_url = 'https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&code=%s&client_id=%s&client_secret=%s&%s' % (code, client_id, client_secret, callback) # 组织获取访问令牌的链接
  # return HttpResponse(login_url)
  response = req.urlopen(login_url).read().decode() # 打开获取访问令牌的链接 access_token:123456789&
  access_token = re.split('&', response)[0] # 获取访问令牌 access_token:123456789
  res = req.urlopen('https://graph.qq.com/oauth2.0/me?' + access_token).read().decode() # 打开获取openid的链接
  openid = json.loads(function.parse_jsonp(res))['openid'] # 从返回数据中获取openid 410225632333335556566
  userinfo = req.urlopen('https://graph.qq.com/user/get_user_info?oauth_consumer_key=%s&openid=%s&%s' % (
   client_id, openid, access_token)).read().decode() # 打开获取用户信息的链接
  # 打印查看获取到的用户信息
  print(userinfo)
  userinfo = json.loads(userinfo) # 将返回的用户信息数据(JSON格式)读取为字典。
  user = Member.objects.filter(member_qq_id=openid) # 查询是否已存在用户
  if not user: # 如果不存在用户
   # 创建新用户
   member_obj = Member.objects.create(member_qq_id=openid,member_nickname=userinfo['nickname'],member_name=userinfo['nickname'],member_photo = userinfo['figureurl_qq_1'])
   # user = Member() # 创建新用户
   # user.member_qq_id = openid # 写入用户信息
   # user.member_nickname = userinfo['nickname'] # 写入用户信息
   # user.member_name = userinfo['nickname'] # 写入用户信息
   # # user.gender = userinfo['gender'] # 写入用户信息
   # user.member_photo = userinfo['figureurl_qq_1'] # 写入用户信息
   # user.save() # 保存或更新用户
   request.session['member_id'] = member_obj.member_id # 将已登录的用户openid写入Session
   request.session['member_name'] = userinfo['nickname']
  # 返回路径至网站首页
  return redirect('/blog/index/')
 else:
  return HttpResponse('授权失败!')

本文是在本地测试项目中的qq登录功能,所以qq互联官网中的回调地址需要修改为本地的地址,

5,启动项目测试功能

6,查看数据库会员表,会员信息已写入。

Django项目中实现使用qq第三方登录功能

总结

以上所述是小编给大家介绍的Django项目中实现使用qq第三方登录功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Django项目中实现使用qq第三方登录功能

Django项目中实现使用qq第三方登录功能

Python 相关文章推荐
Python实现去除代码前行号的方法
Mar 10 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
Nov 20 Python
Python图像灰度变换及图像数组操作
Jan 27 Python
Python多线程扫描端口代码示例
Feb 09 Python
python中的常量和变量代码详解
Jul 25 Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
Jan 15 Python
Python设计模式之代理模式实例详解
Jan 19 Python
python如何制作缩略图
Apr 30 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
python图片合成的示例
Nov 09 Python
Python时间操作之pytz模块使用详解
Jun 14 Python
一篇文章搞定Python操作文件与目录
Aug 13 #Python
Python Django Cookie 简单用法解析
Aug 13 #Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 #Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 #Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 #Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 #Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 #Python
You might like
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
PHP判断图片格式的七种方法小结
2013/06/03 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
2015/03/02 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
手把手搭建安装基于windows的Vue.js运行环境
2017/06/12 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
Python使用requests发送POST请求实例代码
2018/01/25 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
html5 视频播放解决方案
2016/11/06 HTML / CSS
如何在Shell脚本中使用函数
2015/09/06 面试题
班组长安全生产职责
2013/12/16 职场文书
酒店销售主管岗位职责
2014/01/04 职场文书
两只小狮子教学反思
2014/02/05 职场文书
生日庆典策划方案
2014/06/02 职场文书
医院护士工作检讨书
2014/10/26 职场文书
工作收入住址证明
2014/10/28 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB