天天看點

python Django QQ第三方登陸認證

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第三方登陸認證
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