python-flask开发网站接入QQ互联,使用QQ一键登录功能

首页 / 随随便便写 / 正文

最近再用flask开发网站,想到用一键登录的方式去登录网站后台,一开始是想用我的公众号扫码码登录的,这样可以增加公众号的黏性,可是我的公众号是个人的服务号,不支持扫码功能。索性我就选择了QQ互联的网页登录开发。

首先上我网站的登录界面演示图


这样我们就可以直接用过QQ授权登录了

怎么申请QQ互联?

QQ互联官网
Test
先到官网进行 注册 ,第一次使用需要填写个人信息,我是 个人开发者 ,填写好提交后等待审核通过即可
Test
我们需要 创建 一个网页应用,填写一下信息即可提交审核,网站一定是 备案 过的才能提交。

申请注意事项:

Test
需要注意的是你在 提交审核之前 ,必须得现在你的网站界面 加上QQ登录的按钮
我第一次提交申请就是因为这个问题没有给我通过
<a href="https://graph.qq.com/oauth2.0/authorize?client_id=你的应用ID&amp;response_type=code&amp;scope=all&amp;redirect_uri=你需要的回调地址"><img src="https://qzonestyle.gtimg.cn/qzone/vas/opensns/res/img/Connect_logo_7.png" alt="QQ登录" border="0"></a>
上面是登录按钮的代码,放到你网站的适当位置即可,把html代码里面的信息改成你自己的就行了

回调地址的说明

Test
这个回调地址就是你QQ授权登录之后浏览器跳转到的地址(有多个回调低至用分号隔开填写)

开发文档

Test
开发文档地址
由上图我们可以看到开发这样的登录功能只需要三步,我们现在已经把放置按钮的一步做好了
# 现在开始讲解其他两步
## 先把我们后端的代码放上来

class QQLogin:

    # 获取access_token
    @classmethod
    def get_access_token(cls, code: str) -> Union[str, None]:
        redirect_url = 'https://xxx.xxxx.cn/user/QQLogin'  # 重定向地址
        api_url = 'https://graph.qq.com/oauth2.0/token'
        data = {
            "grant_type": "authorization_code",
            "client_id": 应用id,
            "client_secret": "应用key",
            "code": code,
            "redirect_uri": redirect_url,
            "fmt": "json"
        }
        res = requests.get(url=api_url, params=data).json()
        print(res)
        if res.get('error'):  # 获取access_token失败
            return None
        else:
            return res['access_token']

    # 获取openid
    @classmethod
    def get_open_id(cls, access_token: str) -> Union[str, None]:
        api_url = f'https://graph.qq.com/oauth2.0/me'
        get_data = {
            "access_token": access_token,
            "fmt": "json"
        }
        openid_res = requests.get(url=api_url, params=get_data).json()
        if not openid_res.get('code'):  # 没报错
            open_id = openid_res['openid']  # OpenId
            return open_id
        else:  # 获取OpenId失败
            return None

    # 获取登录用户的昵称、头像、性别
    @classmethod
    def get_user_info(cls, access_token: str, open_id: str) -> Union[str, dict]:
        api_url = 'https://graph.qq.com/user/get_user_info'
        get_data = {
            "access_token": access_token,
            "openid": open_id,
            "oauth_consumer_key": 应用id
        }
        res_info = requests.get(url=api_url, params=get_data).json()
        if res_info['ret'] == 0:
            # 获取用户信息
            qq_name = res_info['nickname']  # QQ昵称
            ico_url = res_info['figureurl_qq_2']  # QQ头像 100*100
            return {"qq_name": qq_name, "ico_url": ico_url}
        else:  # 错误-返回响应信息
            return res_info['msg']

上面的代码可以满足登录的需求,我在这也不想多说了,文章写的太累了,玩去了,有基础的朋友可以看看,不懂的朋友可以评论区留言

打赏
评论区
头像
    头像
    rantrism
    2023年03月29日 11:44
    回复

    您好~我是腾讯云开发者社区运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan
    作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器等,另外还有些周边礼物。