最近再用flask开发网站,想到用一键登录的方式去登录网站后台,一开始是想用我的公众号扫码码登录的,这样可以增加公众号的黏性,可是我的公众号是个人的服务号,不支持扫码功能。索性我就选择了QQ互联的网页登录开发。
首先上我网站的登录界面演示图
怎么申请QQ互联?
QQ互联官网
先到官网进行 注册 ,第一次使用需要填写个人信息,我是 个人开发者 ,填写好提交后等待审核通过即可
我们需要 创建 一个网页应用,填写一下信息即可提交审核,网站一定是 备案 过的才能提交。
申请注意事项:
需要注意的是你在 提交审核之前 ,必须得现在你的网站界面 加上QQ登录的按钮
我第一次提交申请就是因为这个问题没有给我通过
<a href="https://graph.qq.com/oauth2.0/authorize?client_id=你的应用ID&response_type=code&scope=all&redirect_uri=你需要的回调地址"><img src="https://qzonestyle.gtimg.cn/qzone/vas/opensns/res/img/Connect_logo_7.png" alt="QQ登录" border="0"></a>
上面是登录按钮的代码,放到你网站的适当位置即可,把html代码里面的信息改成你自己的就行了
回调地址的说明
这个回调地址就是你QQ授权登录之后浏览器跳转到的地址(有多个回调低至用分号隔开填写)
开发文档
开发文档地址
由上图我们可以看到开发这样的登录功能只需要三步,我们现在已经把放置按钮的一步做好了
# 现在开始讲解其他两步
## 先把我们后端的代码放上来
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']
上面的代码可以满足登录的需求,我在这也不想多说了,文章写的太累了,玩去了,有基础的朋友可以看看,不懂的朋友可以评论区留言
2023年03月29日 11:44
您好~我是腾讯云开发者社区运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan
作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器等,另外还有些周边礼物。