第一步:成为开发者

成为QQ互联的开发者,审核通过才可实现;审核通过后要创建应用,即获取本项目对应与QQ互联的应用ID。
QQ登录开发文档:http://wiki.connect.qq.com/准备工作_oauth2-0

第二步:配置参数

成为开发者之后,再django的setting.py文件中配置QQ登录参数

QQ_CLIENT_ID = ''  # appid
QQ_CLIENT_SECRET = ''  # appkey
QQ_REDIRECT_URI = 'http://127.0.0.1:8080/XXX.html'  # 跳转url

然后创建一个新的应用oauth,用来实现QQ第三方认证登录,并注册到
INSTALLED_APPS = ['oauth.apps.oauthConfig',]
设置总路由前缀为 oauth/
在utils/models.py文件中创建模型类基类,用于增加数据新建时间和更新时间

from django.db import modelsclass BaseModel(models.Model):"""为模型类补充字段"""create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")class Meta:abstract = True  # 说明是抽象模型类, 用于继承使用,数据库迁移时不会创建BaseModel的表

然后在oauth/models.py文件中定义QQ身份(openid)与用户模型类User的关联关系

from django.db import models
from utils.models import BaseModel
class OAuthQQUser(BaseModel):# 定义QQ身份(openid)与用户模型类User的关联关系user = models.ForeignKey('users.User', on_delete=models.CASCADE, verbose_name='用户')openid = models.CharField(max_length=64, verbose_name='openid', db_index=True)class Meta:db_table = 'oauth_qq'verbose_name = 'QQ用户数据'verbose_name_plural = verbose_name

第三步:QQ登录扫码页面

提供QQ登录扫码页面网址https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=xxx&redirect_uri=xxx&state=xxx

pip install QQLoginTool 安装qq登录工具
这个集成了QQ辅助类,可以让自己少些写代码,方便调用,这里贴一点它的源代码

from django.conf import settings
from urllib.parse import urlencode, parse_qs
import json
import requestsclass OAuthQQ(object):"""QQ认证辅助工具类"""def __init__(self, client_id=None, client_secret=None, redirect_uri=None, state=None):self.client_id = client_id self.client_secret = client_secret self.redirect_uri = redirect_uriself.state = state   # 用于保存登录成功后的跳转页面路径def get_qq_url(self):# QQ登录url参数组建data_dict = {'response_type': 'code','client_id': self.client_id,'redirect_uri': self.redirect_uri,'state': self.state}# 构建urlqq_url = 'https://graph.qq.com/oauth2.0/authorize?' + urlencode(data_dict)return qq_url# 获取access_token值def get_access_token(self, code):# 构建参数数据data_dict = {'grant_type': 'authorization_code','client_id': self.client_id,'client_secret': self.client_secret,'redirect_uri': self.redirect_uri,'code': code}# 构建urlaccess_url = 'https://graph.qq.com/oauth2.0/token?' + urlencode(data_dict)# 发送请求try:response = requests.get(access_url)# 提取数据# access_token=FE04************************CCE2&expires_in=7776000&refresh_token=88E4************************BE14data = response.text# 转化为字典data = parse_qs(data)except:raise Exception('qq请求失败')# 提取access_tokenaccess_token = data.get('access_token', None)if not access_token:raise Exception('access_token获取失败')return access_token[0]# 获取open_id值def get_open_id(self, access_token):# 构建请求urlurl = 'https://graph.qq.com/oauth2.0/me?access_token=' + access_token# 发送请求try:response = requests.get(url)# 提取数据# callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} );# code=asdasd&msg=asjdhui  错误的时候返回的结果data = response.textdata = data[10:-3]except:raise Exception('qq请求失败')# 转化为字典try:data_dict = json.loads(data)# 获取openidopenid = data_dict.get('openid')except:raise Exception('openid获取失败')return openid

pip install itsdangerous
使用TimedJSONWebSignatureSerializer可以生成带有有效期的token

from itsdangerous import TimedJSONWebSignatureSerializer as TJS
from django.conf import settings# tjs= TJS(秘钥, 有效期秒)
tjs= TJS(settings.SECRET_KEY, 300)
# tjs.dumps(数据), 返回bytes类型
token = tjs.dumps({'mobile': '18512345678'})
token = token.decode()# 检验token
# 验证失败,会抛出itsdangerous.BadData异常
tjs= TJS(settings.SECRET_KEY, 300)
try:data = tjs.loads(token)
except BadData:return None

第四步:获取QQ用户OpenID

扫码成功后,要准备一个回调页面,这里就不做详细的讲解,下面就是获取QQ用户OpenID,
在QQ将用户重定向到此网页的时候,重定向的网址会携带QQ提供的code参数,用于获取用户信息使用,我们需要将这个code参数发送给后端,在后端中使用code参数向QQ请求用户的身份信息,并查询与该QQ用户绑定的用户。

from QQLoginTool.QQtool import OAuthQQ
from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
from django.conf import settings
from rest_framework_jwt.settings import api_settings
from oauth.models import OAuthQQUser
from itsdangerous import TimedJSONWebSignatureSerializer as TJS
from oauth.serializers import OauthSerializersclass QQAuthUserView(APIView):"""用户扫码登录的回调处理"""def get(self, request):# 提取code请求参数code = request.query_params.get('code')if not code:return Response({'message': '缺少code'}, status=status.HTTP_400_BAD_REQUEST)# 创建qq对象oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,client_secret=settings.QQ_CLIENT_SECRET, redirect_uri=settings.QQ_REDIRECT_URI)try:# 使用code向QQ服务器请求access_tokenaccess_token = oauth.get_access_token(code)# 使用access_token向QQ服务器请求openidopenid = oauth.get_open_id(access_token)except Exception:return Response({'message': 'QQ服务异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE)# 使用openid查询该QQ用户是否绑定过用户try:oauth_user = OAuthQQUser.objects.get(openid=openid)except OAuthQQUser.DoesNotExist:# 如果openid没绑定用户,创建用户并绑定到openid# 为了能够在后续的绑定用户操作中前端可以使用openid,在这里将openid签名后响应给前端tjs = TJS(settings.SECRET_KEY, 300)   # 使用TimedJSONWebSignatureSerializer生成带有有效期的tokenopen_id = tjs.dumps({'openid': openid}).decode()return Response({'access_token': open_id})else:# 如果openid已绑定用户,直接生成JWT token,并返回jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLERjwt_encode_handler = api_settings.JWT_ENCODE_HANDLER# 获取oauth_user关联的useruser = oauth_user.userpayload = jwt_payload_handler(user)token = jwt_encode_handler(payload)response = Response({'token': token,'user_id': user.id,'username': user.username})return responsedef post(self, request):# 1、获取前端数据data = request.data# 2、验证数据ser = OauthSerializers(data=data)ser.is_valid()print(ser.errors)# 3、绑定保存数据ser.save()# 4、返回结果return Response(ser.data)

根据openid查询用户,如果能够查询到用户,就直接生成状态保持信息,登录到网站
如果不能查询到用户,就直接将OpenID序列化并返回给前端,用于后续的绑定网站用户操作。

第五步:openid绑定用户

用户需要填写手机号、密码、短信验证码
如果用户未在此网站注册过,则会将手机号作为用户名为用户创建一个网站账户,并绑定用户
如果用户已在此网站注册过,则检验密码后直接绑定用户

django web网站实现第三方QQ登录相关推荐

  1. html输入QQ自动获取QQ头像,我在开发web版使用第三方QQ登录网站的时候,发现引入的QQ头像登录(如下图)很戳,我想问一下这个样式怎么调?...

    2. pageEncoding="utf-8"%> /p> "http://www.w3.org/TR/html4/loose.dtd"> 美 ...

  2. Django项目实战----接入第三方QQ登录绑定用户

    需求 用户点击QQ登录接入第三方登录 不需要输入本网站账户就可登录 如果没有绑定过就注册一个 图解 逻辑流程 用户点击QQ登录按钮,后端使用QQLoginTool第三方库来生成一个 QAuthQQ 对 ...

  3. python实现qq登录_Django网站实现第三方QQ登录

    今天搞好了博客搁置已久的登录功能,目前仅支持第三方登录,这样有效减少了恶意的批量注册,我先来说下第三方登录的原理: 这里以QQ为例 首先,在QQ互联注册开发者并申请自己的博客应用(网上教程大把,这里不 ...

  4. springboot网站应用使用第三方qq登录

    使用第三方qq登录需要在QQ互联官网https://connect.qq.com/中申请成功才可以使用. 1.登录成功后进入个人设置中心设置个人信息 2.选择公司或个人接入,这里我选择个人接入  3. ...

  5. SpringBoot+Vue实现第三方QQ登录(二)

    1. 准备工作_OAuth2.0(官网地址:开发流程) 本步骤的作用: 接入QQ登录前,网站需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权. 1. ...

  6. android登录操作代码,Android Studio实现第三方QQ登录操作代码

    来看看效果图吧 实现QQ登录了, 新建一个项目工程 ,然后把我们刚才下载的SDK解压将jar文件夹中的jar包拷贝到我们的项目libs中 导入一个下面架包就可以 项目结构如下 打开我们的清单文件And ...

  7. SpringBoot+Vue实现第三方QQ登录(一)

    1. QQ登录介绍(测试网站:地址) QQ互联开放平台为第三方网站提供了丰富的API(官网地址: QQ互联官网首页).第三方网站接入QQ互联开放平台后,即可通过调用平台提供的API实现用户使用QQ帐号 ...

  8. Android接入第三方QQ登录

    Android接入第三方QQ登录 前言 开始接入 1. 添加依赖 2.AndroidManifest.xml配置 3.初始化SDK 4.创建实例 5.实现回调 6. 调用QQ登录接口 7.获取用户信息 ...

  9. Android第三方QQ登录、获取个人信息、分享实现

    昨天调试了一下午终于成功 第三方QQ登录.获取个人信息,分享 QQ官方API文档写的太乱 并且很多地方没有更新 这里总结一下 方便记录和回看 实现结果图 首先进入腾讯开放平台 下载QQ的SDK 地址 ...

最新文章

  1. CPD和DESCR文件查看
  2. Linux QtCreator 设置mingw编译器生成windows程序
  3. 装完黑苹果怎么装windows_BlackArch(黑Arch)、怎么装?
  4. Vue之通过代理设置跨域访问
  5. oracle数据库多表联查并排序,oracle数据库之多表联接查询(一)
  6. 数据库中的二级索引_普通索引_辅助索引
  7. ElasticSearch 新增节点,横向扩容
  8. js页面自适应屏幕大小_Web页面适配移动端方案研究
  9. android 按钮列表,android – 如何使按钮看起来像列表
  10. Win11如何开启聚焦功能?Win11开启聚焦功能的方法
  11. InstallShield安装过程介绍
  12. 【渝粤教育】国家开放大学2018年春季 0063-21T中国现当代文学专题 参考试题
  13. 大学生创新创业类竞赛参赛指南
  14. 生如夏花之灿烂,死如秋叶之静美
  15. 信息安全技术——(十五)物联网关键技术
  16. MSP430X1XX系列ADC12和DMA详解(附带程序)(上)--ADC12详解与源码
  17. 程序退出,段错误segment default问题定位
  18. CSR867x一拖多加密工具8670 8675
  19. 数据库笔记——Mysql、Oracle、Sqlserver || Redis、Memcached、mongoDB环境搭建
  20. UE_Visibility Buffer Deferred Material

热门文章

  1. 20天等待,申请终于通过,安装和体验IntelliJ IDEA新UI预览版
  2. 投标要求提供计算机软件著作,中标人具备所投标设备的有效检测报告及系统软件的“著作权证”,是否违规?能否废标?...
  3. ubuntu kof97
  4. QWebEngineView 加载 flash插件参数配置
  5. UID卡、IC卡、ID卡、CUID 卡、FUID 卡、UFUID 卡 有什么区别?
  6. behavior3go行为树节点类型介绍
  7. 迷宫游戏c语言源程序,C语言迷宫游戏设计(源代码+论文)
  8. 掀AI电视普及热潮,暴风TV风迷节总订单量达12万台
  9. 基于java贫困学生信息跟踪管理系统
  10. HistCite的Format: Unknown问题如何解决