django web网站实现第三方QQ登录
第一步:成为开发者
成为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登录相关推荐
- html输入QQ自动获取QQ头像,我在开发web版使用第三方QQ登录网站的时候,发现引入的QQ头像登录(如下图)很戳,我想问一下这个样式怎么调?...
2. pageEncoding="utf-8"%> /p> "http://www.w3.org/TR/html4/loose.dtd"> 美 ...
- Django项目实战----接入第三方QQ登录绑定用户
需求 用户点击QQ登录接入第三方登录 不需要输入本网站账户就可登录 如果没有绑定过就注册一个 图解 逻辑流程 用户点击QQ登录按钮,后端使用QQLoginTool第三方库来生成一个 QAuthQQ 对 ...
- python实现qq登录_Django网站实现第三方QQ登录
今天搞好了博客搁置已久的登录功能,目前仅支持第三方登录,这样有效减少了恶意的批量注册,我先来说下第三方登录的原理: 这里以QQ为例 首先,在QQ互联注册开发者并申请自己的博客应用(网上教程大把,这里不 ...
- springboot网站应用使用第三方qq登录
使用第三方qq登录需要在QQ互联官网https://connect.qq.com/中申请成功才可以使用. 1.登录成功后进入个人设置中心设置个人信息 2.选择公司或个人接入,这里我选择个人接入 3. ...
- SpringBoot+Vue实现第三方QQ登录(二)
1. 准备工作_OAuth2.0(官网地址:开发流程) 本步骤的作用: 接入QQ登录前,网站需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权. 1. ...
- android登录操作代码,Android Studio实现第三方QQ登录操作代码
来看看效果图吧 实现QQ登录了, 新建一个项目工程 ,然后把我们刚才下载的SDK解压将jar文件夹中的jar包拷贝到我们的项目libs中 导入一个下面架包就可以 项目结构如下 打开我们的清单文件And ...
- SpringBoot+Vue实现第三方QQ登录(一)
1. QQ登录介绍(测试网站:地址) QQ互联开放平台为第三方网站提供了丰富的API(官网地址: QQ互联官网首页).第三方网站接入QQ互联开放平台后,即可通过调用平台提供的API实现用户使用QQ帐号 ...
- Android接入第三方QQ登录
Android接入第三方QQ登录 前言 开始接入 1. 添加依赖 2.AndroidManifest.xml配置 3.初始化SDK 4.创建实例 5.实现回调 6. 调用QQ登录接口 7.获取用户信息 ...
- Android第三方QQ登录、获取个人信息、分享实现
昨天调试了一下午终于成功 第三方QQ登录.获取个人信息,分享 QQ官方API文档写的太乱 并且很多地方没有更新 这里总结一下 方便记录和回看 实现结果图 首先进入腾讯开放平台 下载QQ的SDK 地址 ...
最新文章
- CPD和DESCR文件查看
- Linux QtCreator 设置mingw编译器生成windows程序
- 装完黑苹果怎么装windows_BlackArch(黑Arch)、怎么装?
- Vue之通过代理设置跨域访问
- oracle数据库多表联查并排序,oracle数据库之多表联接查询(一)
- 数据库中的二级索引_普通索引_辅助索引
- ElasticSearch 新增节点,横向扩容
- js页面自适应屏幕大小_Web页面适配移动端方案研究
- android 按钮列表,android – 如何使按钮看起来像列表
- Win11如何开启聚焦功能?Win11开启聚焦功能的方法
- InstallShield安装过程介绍
- 【渝粤教育】国家开放大学2018年春季 0063-21T中国现当代文学专题 参考试题
- 大学生创新创业类竞赛参赛指南
- 生如夏花之灿烂,死如秋叶之静美
- 信息安全技术——(十五)物联网关键技术
- MSP430X1XX系列ADC12和DMA详解(附带程序)(上)--ADC12详解与源码
- 程序退出,段错误segment default问题定位
- CSR867x一拖多加密工具8670 8675
- 数据库笔记——Mysql、Oracle、Sqlserver || Redis、Memcached、mongoDB环境搭建
- UE_Visibility Buffer Deferred Material
热门文章
- 20天等待,申请终于通过,安装和体验IntelliJ IDEA新UI预览版
- 投标要求提供计算机软件著作,中标人具备所投标设备的有效检测报告及系统软件的“著作权证”,是否违规?能否废标?...
- ubuntu kof97
- QWebEngineView 加载 flash插件参数配置
- UID卡、IC卡、ID卡、CUID 卡、FUID 卡、UFUID 卡 有什么区别?
- behavior3go行为树节点类型介绍
- 迷宫游戏c语言源程序,C语言迷宫游戏设计(源代码+论文)
- 掀AI电视普及热潮,暴风TV风迷节总订单量达12万台
- 基于java贫困学生信息跟踪管理系统
- HistCite的Format: Unknown问题如何解决