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')
2. 接收Authorization Code
扫码之后会有code
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')
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