Django集成QQ第三方登录完整教程
本文详细介绍如何在Django项目中集成QQ第三方登录功能。内容涵盖获取APP ID和KEY、配置路由与前端链接、封装解析OpenID的工具函数、后端处理授权回调及状态码验证,以及本地测试时的回调地址修改。通过具体代码示例,帮助开发者快速实现用户授权与数据同步。
前置条件与准备工作
在Django项目中接入QQ登录前,必须先在QQ互联官网完成网站应用的创建,并成功获取对应的APP ID和APP KEY。
路由配置与前端入口
第一步是配置项目路由。
# qq登录
path('loginQq/',qq.loginQq,name='loginQq/'),
path('returns/',qq.returns,name='returns/'),
第二步,在前端页面添加QQ登录入口。本文示例未使用图标,而是直接通过a标签发起请求。
<a data-wow-delay=".5s" href="/blog/loginQq/" rel="external nofollow" > » QQ登录</a>
工具函数封装
第三步,在项目应用目录下创建文件夹,并在其中建立文件。该文件用于封装辅助函数,主要功能是从服务器返回的数据中提取(即腾讯数据库中的用户唯一标识)。

封装函数的具体实现如下:
import re
def parse_jsonp(jsonp_str):
try:
return re.search('^[^(]*?\((.*)\)[^)]*$', jsonp_str).group(1)
except:
raise ValueError('无效数据!')
后端逻辑与本地测试
第四步,编写后端处理逻辑。
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互联官网中配置的回调地址修改为本地的服务器地址。
第五步,启动Django项目以测试登录功能是否正常。
第六步,检查数据库中的会员表,确认会员信息已成功写入。

总结部分。
以上内容介绍了在Django项目中实现QQ第三方登录的具体步骤,希望能对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持!若觉得本文有用,欢迎转载,请注明出处,谢谢!


本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













