• 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
    
    • 1

    3. QQLoginTool使用说明

    1.导入

    from QQLoginTool.QQtool import OAuthQQ
    
    • 1

    2.初始化OAuthQQ对象

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

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

    login_url = oauth.get_qq_url()
    
    • 1

    4.通过Authorization Code获取Access Token

    access_token = oauth.get_access_token(code)
    
    • 1

    5.通过Access Token获取OpenID

    openid = oauth.get_open_id(access_token)
    
    • 1

    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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    在这里插入图片描述

    在这里插入图片描述

    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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    在这里插入图片描述
    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 openid
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
  • 相关阅读:
    Docker 部署常用应用(持续更新中)
    SpringMVC 异常处理器
    JVM高频知识点总结【3】
    Matlab复习回顾919+920预习Lab1
    动态规划股票问题对比
    项目中遇到的一些问题总结(十三)
    vue2和vue3浏览器兼容性对比
    智能的关键——新逻辑
    ubuntu下查看文件(夹)大小的命令
    Reactor模型详解
  • 原文地址:https://blog.csdn.net/qq_43030934/article/details/125615531