python Django QQ第三方登陆认证

时间:2022-10-04 20:57:30


QQ登录开发文档

QQ登录:即我们所说的第三方登录,是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目。

1. QQ互联开发者申请步骤

若想实现QQ登录,需要成为QQ互联的开发者,审核通过才可实现。

相关连接: ​​http://wiki.connect.qq.com/%E6%88%90%E4%B8%BA%E5%BC%80%E5%8F%91%E8%80%85​

2. QQ互联应用申请步骤

成为QQ互联开发者后,还需创建应用,即获取本项目对应与QQ互联的应用ID。

相关连接: ​​http://wiki.connect.qq.com/__trashed-2​

3. 网站对接QQ登录步骤

QQ互联提供有开发文档,帮助开发者实现QQ登录。

相关连接: ​​http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0​

QQ登录工具QQLoginTool

1. QQLoginTool介绍

该工具封装了对接QQ互联的请求操作。
可用于快速实现QQ登录的一种工具包。

2. QQLoginTool安装

pip install QQLoginTool

3. QQLoginTool使用说明

1.导入

from QQLoginTool.QQtool import

2.初始化OAuthQQ对象

oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID, client_secret=settings.QQ_CLIENT_SECRET, redirect_uri=settings.QQ_REDIRECT_URI, state=next)

3.获取QQ登录扫码页面,扫码后得到Authorization Code

login_url = oauth.get_qq_url()

4.通过Authorization Code获取Access Token

access_token = oauth.get_access_token(code)

5.通过Access Token获取OpenID

openid = oauth.get_open_id(access_token)

1. 获取QQ登录扫码页面

from QQLoginTool.QQtool import OAuthQQ
import logging

logger = logging.getLogger('django')
# QQ登录参数
# 我们申请的 客户端id
QQ_CLIENT_ID = '101474184'
# 我们申请的 客户端秘钥
QQ_CLIENT_SECRET = 'c6ce949e04e12ecc909ae6a8b09b637c'
# 我们申请时添加的: 登录成功后回调的路径
QQ_REDIRECT_URI = 'http://www.meiduo.site:8080/oauth_callback.html'


class QQAuthURLView(object):
"""提供QQ登录页面网址
https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=xxx&redirect_uri=xxx&state=xxx
"""

def get_login_url(self):
# next表示从哪个页面进入到的登录页面,将来登录成功后,就自动回到那个页面
next = 'next'

# 获取QQ登录页面网址
oauth = OAuthQQ(client_id=QQ_CLIENT_ID,
client_secret=QQ_CLIENT_SECRET,
redirect_uri=QQ_REDIRECT_URI,
state=next)
login_url = oauth.get_qq_url()

print(login_url)


class QQAuthGetOpenId(object):
"""用户扫码登录的回调处理"""

def get_open_id(self, code):
"""Oauth2.0认证"""
# 提取code请求参数
code = code

# 创建工具对象
oauth = OAuthQQ(client_id=QQ_CLIENT_ID, client_secret=QQ_CLIENT_SECRET, redirect_uri=QQ_REDIRECT_URI)

try:
# 使用code向QQ服务器请求access_token
access_token = oauth.get_access_token(code)

# 使用access_token向QQ服务器请求openid
openid = oauth.get_open_id(access_token)
print(openid)
except Exception as e:
logger.error(e)


if __name__ == '__main__':
qq = QQAuthURLView()
qq.get_login_url()

# openId = QQAuthGetOpenId()
# # openId.get_open_id('9F40A70B62C0C6EC611B5774CB579C62')
# openId.get_open_id('FE5C333C928EE7299B7ED240BB706255')

python Django QQ第三方登陆认证


2. 接收Authorization Code

扫码之后会有code

python Django QQ第三方登陆认证

3. OAuth2.0认证获取openid

使用code向QQ服务器请求access_token
使用access_token向QQ服务器请求openid

from QQLoginTool.QQtool import OAuthQQ
import logging

logger = logging.getLogger('django')
# QQ登录参数
# 我们申请的 客户端id
QQ_CLIENT_ID = '101474184'
# 我们申请的 客户端秘钥
QQ_CLIENT_SECRET = 'c6ce949e04e12ecc909ae6a8b09b637c'
# 我们申请时添加的: 登录成功后回调的路径
QQ_REDIRECT_URI = 'http://www.meiduo.site:8080/oauth_callback.html'


class QQAuthURLView(object):
"""提供QQ登录页面网址
https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=xxx&redirect_uri=xxx&state=xxx
"""

def get_login_url(self):
# next表示从哪个页面进入到的登录页面,将来登录成功后,就自动回到那个页面
next = 'next'

# 获取QQ登录页面网址
oauth = OAuthQQ(client_id=QQ_CLIENT_ID,
client_secret=QQ_CLIENT_SECRET,
redirect_uri=QQ_REDIRECT_URI,
state=next)
login_url = oauth.get_qq_url()

print(login_url)


class QQAuthGetOpenId(object):
"""用户扫码登录的回调处理"""

def get_open_id(self, code):
"""Oauth2.0认证"""
# 提取code请求参数
code = code

# 创建工具对象
oauth = OAuthQQ(client_id=QQ_CLIENT_ID, client_secret=QQ_CLIENT_SECRET, redirect_uri=QQ_REDIRECT_URI)

try:
# 使用code向QQ服务器请求access_token
access_token = oauth.get_access_token(code)

# 使用access_token向QQ服务器请求openid
openid = oauth.get_open_id(access_token)
print(openid)
except Exception as e:
logger.error(e)


if __name__ == '__main__':
# qq = QQAuthURLView()
# qq.get_login_url()

openId = QQAuthGetOpenId()
# openId.get_open_id('9F40A70B62C0C6EC611B5774CB579C62')
openId.get_open_id('BB8C5E2C5EC2DB69579158D8B02B9533')

python Django QQ第三方登陆认证


QQTool.py源码

from django.conf import settings
from urllib.parse import urlencode, parse_qs
import json
import requests


class 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_uri
self.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
}

# 构建url
qq_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
}

# 构建url
access_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************************BE14
data = response.text

# 转化为字典
data = parse_qs(data)
except:
raise Exception('qq请求失败')

# 提取access_token
access_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):

# 构建请求url
url = '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.text
data = data[10:-3]
except:
raise Exception('qq请求失败')
# 转化为字典
try:
data_dict = json.loads(data)
# 获取openid
openid = data_dict.get('openid')
except:
raise Exception('openid获取失败')

return