当前位置: 首页 > article >正文

QQ 第三方登录(Django)

QQ 第三方登录Django本篇教程完全面向 Django 开发者从 QQ 互联原理、三端交互流程到完整代码实现一步到位新手可直接复制粘贴跟着操作避开所有常见踩坑点兼顾教学和实战需求。一、核心原理与三端交互流程1.1 核心角色用户发起登录请求的终端用户浏览器/客户端Django 后端我们自己的服务负责接收 QQ 回调、处理凭证交换、完成登录逻辑QQ 第三方服务提供授权、凭证发放、用户信息查询的服务QQ 互联平台1.2 核心凭证说明code临时授权码用户授权后 QQ 返回给 Django 后端单次有效、时效10分钟仅用于换取access_tokenaccess_token访问令牌用于向 QQ 服务请求用户资源如昵称、头像时效较长openid用户在当前 QQ 应用中的唯一身份标识用于绑定 Django 本地用户终身唯一同一用户在同一 QQ 应用下 openid 不变1.3 三端交互流程图二、前置准备QQ 互联平台配置在写代码前必须先在 QQ 互联平台完成配置获取核心参数APP_ID和APP_KEY步骤如下访问 http://connect.qq.com/intro/login/注册开发者账号需实名认证登录后进入「应用管理」→「创建应用」选择「网站应用」填写应用基本信息网站名称、域名、简介等提交审核审核约1-2个工作日个人开发者可正常通过审核通过后进入应用详情页获取APP ID和APP Key后续配置用配置「回调地址」在应用详情→「接口设置」中添加回调地址必须与 Django 代码中配置一致示例http://127.0.0.1:8000/user/qq/callback/开启「获取用户信息」接口权限默认开启若未开启需手动开启。⚠️ 注意本地开发时回调地址可使用127.0.0.1上线后需替换为自己的域名如https://www.xxx.com/user/qq/callback/。三、Django 项目环境准备3.1 安装依赖pip install djangorestframework #django的前后端分离拓展 pip install QQLoginTool #qq登录的SDK四、Django 核心配置修改项目settings.py添加 QQ 登录相关配置以及注册新建的user应用。# settings.py INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, oauth, # 注册用户应用 ] # QQ 第三方登录配置替换为你自己的 APP_ID 和 APP_KEY # QQ登录参数 QQ_CLIENT_ID #APP_ID QQ_CLIENT_SECRET #APP_KEY QQ_REDIRECT_URI http://localhost/oauth_callback.html # 与QQ互联配置的回调地址一致五、完整代码实现核心代码集中在oauth/views.py处理登录逻辑、回调逻辑、oauth/urls.py配置路由、oauth/utils对openid的加密解密逻辑蹲、oauth/serializers(数据格式的转换)。5.0 工具类utils.pyfrom itsdangerous import TimedSerializer as TJWSSerializer, BadData from django.conf import settings def generate_save_user_token(openid): 对openid进行加密 #1 创建序列化器 serializer TJWSSerializer(settings.SECRET_KEY) #2 对openid进行加密dumps加密后的数据是bytes类型 data {openid: openid} token serializer.dumps(data) #3 把加载后的openid返回 return token.decode() def check_save_user_token(access_token): 传入加密的openid进行解密并返回 # 创建加密的序列化器对象secret_key serializer TJWSSerializer(settings.SECRET_KEY) # 调用loads方法进行解密 try: data serializer.loads(access_token) except BadData: return None else: return data.get(openid)5.1序列化器类serializers.pyfrom django_redis import get_redis_connection from rest_framework import serializers from oauth.models import OAuthQQUser from oauth.utils import check_save_user_token from users.models import User class QQAuthUserSerializer(serializers.Serializer): openid绑定用户序列化器 #mobile password sms_code Token mobile serializers.RegexField(label手机号,regexr^1[3-9]\d{9}$) password serializers.CharField(label确认密码, write_onlyTrue) sms_code serializers.CharField(label验证码, write_onlyTrue) access_token serializers.CharField(label加密后的openid) def validate(self, attrs): # 1.把加密后的openid取出来 加密 access_token attrs.get(access_token) openid check_save_user_token(access_token) if openid is None: raise serializers.ValidationError(openid无效) #将解密后的openid重新添加到attrs(以备后期create方法中绑定使用) attrs[openid] openid # 2.校验验证码 redis_conn get_redis_connection(verify_codes) # 连接我们settings中定义的verify_codes数据库 mobile attrs[mobile] real_sms_code redis_conn.get(sms_%s % mobile) # 想redis存储数据时都是以字条串进行存储的取出来后都是bytes类型【bytes】 if real_sms_code is None or attrs[sms_code] ! real_sms_code.decode(): raise serializers.ValidationError(验证码错误) # 3.拿手机号查询user表如果能查到说明手机号已注册再检验密码是否一致 try: user User.objects.get(mobilemobile) except: pass else: if user.check_password(attrs[password]) is False: raise serializers.ValidationError(密码错误) else: #如果用户存在且密码正确把当前user对象存储到反序列化大字典里以备后期绑定使用 attrs[user] user return attrs def create(self, validated_data): #1 获取validated_data中的user能取到说明用户存在 user validated_data.get(user) if user is None: #2 如果没取到user 新建用户 user User( username validated_data.get(mobile), mobilde validated_data.get(mobile) ) user.set_password(validated_data.get(password)) user.save() #3 openid与user绑定 OAuthQQUser.objects.create( openidvalidated_data.get(access_token), useruser, ) return user5.2 视图函数views.py包含两个核心视图QQOauthURLView拼接QQ登录URL、QQAuthUserView处理回调、凭证交换、登录逻辑。from rest_framework import status from rest_framework.views import APIView from QQLoginTool.QQtool import OAuthQQ from rest_framework.response import Response from django.conf import settings from .models import OAuthQQUser from carts.utils import merge_cart_cookie_to_redis from meiduo_mall.utils.exceptions import logger from rest_framework_simplejwt.tokens import RefreshToken from .serializers import QQAuthUserSerializer from .utils import generate_save_user_token # Create your views here. class QQOauthURLView(APIView): 拼接好qq登录的路由 def get(self, request): #1.拼接好前端传来的next参数记录用户从哪里来到qq页面 next request.query_params.get(next) if not next: next / #2 利用qq登录SDK (app_ID app_key 回调域名 记录来源)参数必传 oauth OAuthQQ(client_idsettings.QQ_CLIENT_ID, client_secretsettings.QQ_CLIENT_SECRET, redirect_urisettings.QQ_REDIRECT_URI, statenext) #3 创建QQ登录工具对象 # 调用SDK里的方法拼接好QQ登陆网址 login_url oauth.get_qq_url() return Response({login_url: login_url}) class QQAuthUserView(APIView): qq登陆成功后的回调处理 def get(self, request): #获取前端传入的code code request.query_params.get(code) if not code: return Response({message:确实code},statusstatus.HTTP_400_BAD_REQUEST) #创建qq登录工具对象 oauth OAuthQQ(client_idsettings.QQ_CLIENT_ID, client_secretsettings.QQ_CLIENT_SECRET, redirect_urisettings.QQ_REDIRECT_URI, statenext) try: #调用get_access_token(code)用code向qq服务器获取access_token access_token oauth.get_access_token(code) #调用get_open_id(access_token) 用access_token响应qq服务器获取open_id openid oauth.get_open_id(access_token) except Exception as e: logger.info(e) return Response({message:qq服务器不可用},statusstatus.HTTP_503_SERVICE_UNAVAILABLE) #查询数据库有无openid try: authQQUserModelOAuthQQUser.objects.get(openidopenid) except OAuthQQUser.DoesNotExist: #若没有则新建用户绑定openid前端暂存加密后的openid openid_encoded generate_save_user_token(openid) return Response({access_token:openid_encoded },statusstatus.HTTP_404_NOT_FOUND) else: #若有openid直接登陆成功给前端返回JWT状态保存信息 user authQQUserModel.user refresh RefreshToken.for_user(user) access_token refresh.access_token response Response({ access_token: str(access_token), refresh_token: str(refresh), username:user.username, user_id:user.id }) #创建响应对象 merge_cart_cookie_to_redis(request,user,response) return response def post(self, request): openid绑定用户接口 #创建序列化器进行反序列化 serializer QQAuthUserSerializer(datarequest.data) #调用is_valid方法校验 serializer.is_valid(raise_exceptionTrue) #调用序列化器的save方法 user serializer.save() #生成JWT状态保存token refresh RefreshToken.for_user(user) access_token str(refresh.access_token) #响应 return Response({ access_token: access_token, refresh_token: str(refresh), username:user.username, user_id:user.id })5.3 路由配置urls.py分别配置「QQ登录跳转路由」和「回调路由」修改oauth/urls.py若没有该文件新建一个。from django.urls import re_path from . import views urlpatterns [ # 拼接qq登录URL re_path(rqq/authorization/$, views.QQOauthURLView.as_view()), # qq登录成功后的回调处理 re_path(rqq/user/$, views.QQAuthUserView.as_view()), ]5.4 前端登录在前端资源login.js中添加 QQ 登录按钮,这里只展示绑定的请求。// qq登 录 qq_login: function () { var next this.get_query_string(next) || /; axios.get(this.host /oauth/qq/authorization/?next next, { responseType: json, withCredentials: true }) .then(response { location.href response.data.login_url; }) .catch(error { console.log(error.response.data); }) } } //回调页面以查询字符串方式携带code axios.get(this.host /oauth/qq/user/?code code, { responseType: json, withCredentials: true // 跨域允许携带cookie })六、登陆的整个逻辑

相关文章:

QQ 第三方登录(Django)

QQ 第三方登录(Django) 本篇教程完全面向 Django 开发者,从 QQ 互联原理、三端交互流程,到完整代码实现,一步到位,新手可直接复制粘贴跟着操作,避开所有常见踩坑点,兼顾教学和实战需…...

网安第十一节

四、Web后端PHP基础安全 PHP核心原理与文件上传 1、PHP介绍 1.定义 PHP(Hypertext Preprocessor,超文本预处理器)是一门开源的服务器端脚本编程语言,专门用于开发Web网站的后端逻辑。 2.核心关键 服务器端:PHP代码只…...

【面板数据】地级市及区县人口空心化数据(2000-2024年)

人口空心化是指在城镇化和人口迁移过程中,区域青壮年劳动力及常住人口持续外流,导致人口规模收缩、人口老龄化加深、人口空间集聚能力下降和社会经济活力减弱的现象 参照陈义勇等(2025)文中关于人口空心化指标的衡量方式&#xf…...

从晶体管到ALU:计算机运算基础全解析

1. 从晶体管到二进制:计算机运算的物理基础现代计算机的核心运算能力源于晶体管这一基础电子元件的巧妙运用。晶体管本质上是一个由半导体材料制成的三端器件,通过控制其中一个电极(基极或栅极)的电压,可以精确控制另外…...

号令天下专业版手机尾号是五鬼好吗

在数字能量学的趣味研究领域中,手机号码的数字组合被赋予了各种独特的意义,其中“尾号五鬼”的磁场组合常常引发人们的关注。在数字能量学的认知体系里,“尾号五鬼”被视作一种带有负面能量的磁场组合,通常与不稳定、变化频繁、财…...

RT-Thread信号量机制解析与应用实践

1. RT-Thread信号量机制深度解析在嵌入式实时操作系统中,线程同步是确保多线程有序协作的关键机制。RT-Thread作为一款优秀的实时操作系统,提供了包括信号量在内的多种同步方式。信号量特别适合处理资源计数和线程间同步的场景,比如传感器数据…...

SEO_掌握这5个SEO技巧,让流量持续增长

SEO技巧:让你的网站流量持续增长的5个关键策略 在当今数字化时代,网站流量的稳定增长对于企业的成功至关重要。搜索引擎优化(SEO)是提高网站流量的核心手段之一。掌握一些关键的SEO技巧,不仅可以帮助你在搜索结果中获…...

Jupyter notebook学习容易忘的点

数字数字计算符合常识选择run selected cell就能运行单个块字符串字符串也能计算转义字符\n 表示换行\t 表示tab\\ 表示\ 斜杠本身...

人到中年,生日收到这三条短信,我读了很久

手机屏幕亮了一下。 我拿起来,以为是工作消息,结果是中国工商银行的短信: 紧接着,第二条进来了——中国联通: 第三条,是母校辽工大发来的: 我看着这三条短信,愣了很久。 没有酒局的邀…...

第三次学习C语言有感

我是一名大一学生,学习的专业是自动化,报专业时想着的是自动化可以走的方面是很广的,想着大学里面可以多多尝试不一样东西看自己对哪一样感兴趣。说实话,因为我对单片机感兴趣才驱使我学习C语言的,虽然嘴上说的是C语言…...

一文详解RPC,深入浅出从原理到主流框架

什么是RPC? RPC 全称 Remote Procedure Call,即远程过程调用。它的核心目标非常简单:让开发者调用远程机器上的函数/方法,就像调用本地函数一样简单,无需关注底层的网络连接、数据传输、序列化与反序列化等繁琐细节[1]…...

万字干货 | OpenClaw 进阶玩法大全:技能 / 多 Agent / 省钱 / 安全,+ 实战技巧一次学会

1.概述在人工智能快速发展的今天,AI不再仅仅是回答问题的聊天机器人,而是正在演变为能够主动完成复杂任务的智能代理。OpenAI的Codex CLI就是这一趋势的典型代表——一个跨平台的本地软件代理,能够在用户的机器上安全高效地生成高质量的软件变…...

SpringCloud快速入门--GateWay路由网关与Config配置中心

背景 StreamJsonRpc 是微软官方维护的用于 .NET 和 TypeScript 的 JSON-RPC 通信库,以其强大的类型安全、自动代理生成和成熟的异常处理机制著称。在 HagiCode 项目中,为了通过 ACP (Agent Communication Protocol) 与外部 AI 工具(如 iflow …...

5 分钟搭建智能终端:自动补全 + 历史建议 + 语法高亮,效率拉满

文章目录 📖 介绍 📖 🏡 演示环境 🏡 📒 终端优化指南:补全、提示与高亮一步到位 📒 📝 实现效果与核心能力 📝 Windows 平台完整配置步骤 📝 Linux 平台完整配置步骤 📝 macOS(苹果)平台配置步骤 📝 各平台效果说明 ⚓️ 相关链接 ⚓️ 📖 介绍 �…...

基于智能软开关的配电网优化调度分析(含故障恢复能力与分布式电源影响)

基于智能软开关的配电网优化调度matlab 采用matlab编程,分析得到了含智能软开关下的配电网故障恢复能力,包括恢复负荷、失电节点以及节点电压等,程序选择标准ieee33节点系统作为分析对象,采用yalmip编程,运行稳定。 这…...

效率提升不可想象!传统程序员转型AI数字化办公专家,如何靠提效工具实现升职

不是加班感动老板,而是工具改变产出01. 一个真实的职场跃迁张恒,35岁,某传统IT部门的Java开发,月薪28K。他技术扎实,但部门不核心,干的都是“增删改查报表导出”。每年晋升答辩,评委都说“表现不…...

探索MATLAB/Simulink下风光储电解制氢与氢燃料电池系统仿真模型

MATLAB/Simulink风光储电解制氢与用氢燃料电池系统仿真模型(风光伏耦合电解槽制氢和PEM燃料发电 附参考文献 电解槽和燃料电池都有水热管理模型 光储电解制氢模型,电解槽恒功率制氢,光伏风机耦合PEM制氢,电解槽与燃料电池&#xf…...

OpenClaw语音交互方案:千问3.5-27B对接Whisper实现听写

OpenClaw语音交互方案:千问3.5-27B对接Whisper实现听写 1. 为什么需要语音交互自动化 上个月帮朋友整理一场3小时的行业访谈录音时,我对着逐字稿反复暂停播放、标记重点、提炼观点,整整花了6小时才完成笔记。这种机械劳动让我开始思考&…...

白嫖DeepSeek、GLM、MiniMax、Kimi等大模型,每天 1亿 Token 免费领!

每天免费领 1亿 Token,白嫖DeepSeek、GLM、MiniMax、Kimi等大模型! 最近折腾 AI 编程的朋友估计挺多的。这玩意儿现在进化得确实有点吓人。就拿名气最大的 Claude Code 来说,它这个命令行工具直接把写代码变成了“在线聊天”。你只要嘴上说清…...

OpenClaw配置优化:千问3.5-9B长任务稳定性提升50%

OpenClaw配置优化:千问3.5-9B长任务稳定性提升50% 1. 问题背景与挑战 去年11月接手一个自动化内容处理项目时,我第一次遭遇OpenClaw长任务执行的"断链"问题。当时需要连续完成"爬取网页→提取关键数据→生成报告→邮件发送"四个步…...

TPA2016D2音频放大器Arduino驱动与AGC工程实践

1. 项目概述Adafruit TPA2016 Library 是一款专为 Texas Instruments TPA2016D2 音频功率放大器设计的 Arduino 兼容驱动库。该库封装了 IC 协议通信、寄存器配置、自动增益控制(AGC)参数调节及硬件复位管理等底层操作,使嵌入式开发者无需直接…...

嵌入式开发全流程:从芯片设计到系统部署

1. 嵌入式开发全景解析:从芯片设计到系统部署作为一名在嵌入式领域摸爬滚打十年的老兵,我见过太多初学者被这个行业的复杂性吓退。但我想说的是——嵌入式开发确实门槛高,但绝非不可攻克。关键在于理解它的技术栈构成,就像搭积木一…...

【2026 CVPR】Asking like Socrates: Socrates helps VLMs understand remote sensing images

RS-EoT (Remote Sensing Evidence-of-Thought) 研究旨在解决视觉语言模型(VLM)在处理遥感图像时的“虚假推理”问题 。 文章目录 核心问题 核心思想 核心方法 A. 数据合成:SocraticAgent Data Statistics B. 训练策略:两阶段渐进式强化学习 (RL) C. 训练策略 实验验证 主要…...

智能体学习9——CrewAI-Agent与Task核心方法详解

文章目录 CrewAI Agent 与 Task 核心方法详解 一、Agent() — 定义智能体 1.1 完整参数表 1.2 核心三要素 1.3 双模型策略 1.4 常见配置模板 1.5 直接调用(不经过 Crew) 二、Task() — 定义任务 2.1 完整参数表 2.2 参数详解 2.3 context 参数(关键) 2.4 完整使用示例 三、…...

SEO优化师如何制定优化策略和计划_SEO优化师如何分析网站流量和排名数据

SEO优化师如何制定优化策略和计划_SEO优化师如何分析网站流量和排名数据 前言 SEO(搜索引擎优化)在现代数字营销中扮演着至关重要的角色。对于一个SEO优化师来说,制定有效的优化策略和计划是关键,分析网站流量和排名数据能帮助他…...

第十六天~在Arxml中创建一个IPDU Group

1. 为什么你的ECU需要IPDU Group? 想象这样一个场景:你的汽车ECU在正常运行时,只需要周期性发送几个核心CAN报文,比如车速、转速、水温。但当诊断仪连接上来,或者某个特殊条件触发(比如车辆进入工厂测试模式),你需要瞬间“激活”另外15个用于调试和标定的私有报文。更…...

OpenClaw家庭作业助手:Qwen3-14B解析数学题并分步讲解

OpenClaw家庭作业助手:Qwen3-14B解析数学题并分步讲解 1. 为什么需要家庭作业助手? 作为一个经常辅导孩子功课的家长,我深刻体会到传统辅导方式的痛点。每天晚上检查作业时,孩子遇到不会的题目需要等待家长解答,而家…...

实测对比:ChatGPT、Gemini、Grok、Claude 在四个开发任务中的表现差异

2026年,AI编程助手已经成为开发者的标配。但不同模型在不同任务上的表现差异很大,选对模型往往能事半功倍。本文基于同一测试环境(聚合平台solo.kulaai.cn),对四款主流模型进行了横向对比,记录下实测数据&a…...

C语言指针核心解析与六大实战应用

1. 指针在C语言中的核心地位指针是C语言的灵魂所在,它直接操作内存地址的特性赋予了程序员极大的灵活性。在嵌入式开发领域,指针的使用频率尤其高,因为我们需要直接与硬件寄存器打交道,进行内存管理等底层操作。注意:指…...

快照模式 vs 命令模式:一篇分清什么时候用谁

在做带撤销、回滚、历史记录的功能时,我们最常纠结两个设计模式:快照模式(备忘录模式)和命令模式。很多同学容易混淆,其实核心区别一句话就能记住: 快照存数据,命令存动作。 下面用最清晰、最好…...