天天看点

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