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')
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