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中的filter和lambda函数的使用
Apr 07 Python
python 时间戳与格式化时间的转化实现代码
Mar 23 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
python snownlp情感分析简易demo(分享)
Jun 04 Python
python+pillow绘制矩阵盖尔圆简单实例
Jan 16 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
Oct 11 Python
python使用matplotlib绘制热图
Nov 07 Python
python itchat实现调用微信接口的第三方模块方法
Jun 11 Python
python异常触发及自定义异常类解析
Aug 06 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
Aug 29 Python
python+selenium实现12306模拟登录的步骤
Jan 21 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
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
php实现简单洗牌算法
2013/06/18 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
PHP实现将标点符号正则替换为空格的方法
2017/08/09 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
PHP 裁剪图片
2021/03/09 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
JQuery中getJSON的使用方法
2010/12/13 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
jQuery实现点击该行即可删除HTML表格行
2014/10/17 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
2016/02/25 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
2018/03/07 Javascript
详解微信小程序的 request 封装示例
2018/08/21 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
python实现按行切分文本文件的方法
2016/04/18 Python
浅谈python中get pass用法
2019/03/19 Python
基于python if 判断选择结构的实例详解
2019/05/06 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
详解python中eval函数的作用
2019/10/22 Python
Python Django中的STATIC_URL 设置和使用方式
2020/03/27 Python
python程序需要编译吗
2020/06/19 Python
python爬虫工具例举说明
2020/11/30 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
初中新生军训方案
2014/05/13 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
作风整顿剖析材料
2014/09/30 职场文书
2014年学生会工作总结
2014/11/07 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
就业推荐表导师评语
2014/12/31 职场文书
司机个人年终总结
2015/03/03 职场文书
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技