QQ登录,亦即我们所说的第三方登录,是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录网站/移动端。

在进行QQ登陆的实现之前,我们需要根据QQ互联的要求,进行相关的操作:
1.成为开发者 参考链接 : http://wiki.connect.qq.com/成为开发者
2.应用创建 参考链接:http://wiki.connect.qq.com/__trashed-2


假设条件:

㈠:我的网站的域名是: http://iloveqq.com

㈡:用户在访问:http://iloveqq.com/like 界面时需要进行登陆

㈢:QQ认证的相关函数,我们放在一个类中,作为方法,在使用的时候,可以通过对象调用方法的方式来进行操作:

class OAuthQQ(object):"""QQ认证辅助工具"""def __init__(self, client_id=None, redirect_uri=None, state=None, client_secret=None):#  settings中有client_id,redirect_uri,client_secret的值,如果在创建对象的时候不传参,默认使用配置中的;self.client_id = client_id or settings.QQ_CLIENT_IDself.redirect_uri = redirect_uri or settings.QQ_REDIRECT_URIself.state = state or settings.QQ_STATEself.client_secret = client_secret or settings.QQ_CLIENT_SECRET

㈣: urllib使用说明
在后端接口中,我们需要向QQ服务器发送请求,查询用户的QQ信息,Python提供了标准模块urllib可以帮助我们发送http请求。
1.将query字典转换为url路径中的查询字符串

urllib.parse.urlencode(query)

2.将qs查询字符串格式数据转换为python的字典

urllib.parse.parse_qs(qs)

3.发送http请求,如果data为None,发送GET请求,如果data不为None,发送POST请求

urllib.request.urlopen(url, data=None)

返回response响应对象,可以通过read()读取响应体数据,需要注意读取出的响应体数据为bytes类型


现在来说一下,整个QQ登陆的过程:

Step1:获取Authorization Code

1.用户进行qq登陆 - - QQ服务器生成code

用户想进入like.html界面进行查阅,但是网站跳出登陆界面,显示必须先登录才能继续查看;然后,用户点击qq登陆的图标,然后出现这样的图片:

用户点击qq登陆的时候,我们需要将登陆qq的url返回给用户,这个url必须是可以进行qq登陆,满足qq互联的要求:

如下图所示,我们需要请求的网址是:https://graph.qq.com/oauth2.0/authorize; 同时,我们还需要将response_type,client_id, redirect_uri,state这几个参数放在链接后面携带过去

后端生成登陆地址(生成login_url的方式如下):

def get_qq_login_url(self):"""获取qq登录的网址:return: url网址"""params = {'response_type': 'code','client_id': self.client_id,'redirect_uri': self.redirect_uri,'state': self.state }url = 'https://graph.qq.com/oauth2.0/authorize?' + urlencode(params)return url

注意,在qq登陆时序图中,我们需要获取到用户想要访问的界面,也就是本案例中的http://iloveqq.com/like 链接,此时前端是通过next=http://iloveqq.com/like 传给后端的,然后后端在生成url时,通过获取next参数并传入get_qq_login_url(state)这个函数中,给state赋值:

login_url = get_qq_login_url(next)

然后再将login_url返回给前端,此时用户通过扫描二维码,进行授权登陆,用户登陆成功。

2.登陆成功,服务器获取code

在用户授权确认登陆的时候,QQ会将返回回调页面 redirect_uri.html,当然,此时,QQ返回的参数中,还携带了codestate参数(上面传入的next参数的内容);

此时用户需要访问我们的回调页面 redirect_uri.html,当然请求的时候,除了回调页面,还会携带参数code和state:
访问链接比如: GET /oauth/qq/user/?code=xxx

此时,后端可以通过查询字符串的参数获取方式,获取到code数据

Step2:通过Authorization Code获取Access Token

3.我的服务器和QQ服务器的纠缠-- Access Token

此时,后端是已经获取到梦寐以求的code数据了,现在开始就是我们自己的服务器和QQ服务器之间的数据获取了。

1.根据code,向QQ服务器发送请求获取access_token:

    def get_access_token(self, code):"""获取access_token值"""params = {'grant_type': 'authorization_code','client_id': self.client_id,'client_secret': self.client_secret,'code': code,'redirect_uri': self.redirect_uri}url = 'https://graph.qq.com/oauth2.0/token?' + urlencode(params)#向qq服务器发送GET请求,链接是urlresponse = urlopen(url)#QQ返回的响应数据通过read()读取,并且需要进行解码resp_data = response.read().decode()# 将接收的resp_data查询字符串格式数据转换为python的字典resp_dict = parse_qs(resp_data)# 通过字典取值的方式,获取access_token的值access_token = resp_dict.get('access_token')# 获取到的access_token是一个列表,类似['2334tf2rwfreytrhh'],所以需要通过索引access_token[0]取出字符串数据return access_token[0]

Step3:通过Access Token 获取获取用户OpenID_OAuth2.0

4.我的服务器和QQ服务器的纠缠-- OpenID

上一步已经通过code获取到Access Token的值,现在可以通过Access Token获取openid的值了:

    def get_openid(self, access_token):"""openid的获取"""url = 'https://graph.qq.com/oauth2.0/me?access_token=' + access_token# 访问QQ服务器response = urlopen(url)resp_data = response.read().decode()  # 字符串try:# 返回的数据 ‘callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} )\n’  取出数据,并将字符串转为字典data = json.loads(resp_data[10:-4])  # 也可以使用正则取出数据except Exception:# 接口调用有错误时,会返回code和msg字段data = parse_qs(resp_data)logger.error('code=%s msg=%s' % (data.get('code'), data.get('msg')))raise QQAPIErroropenid = data.get('openid', None)return openid

每一个openid会对应一个QQ号,在后端获取到openid之后,可以根据后端的逻辑进行相关处理。


完整的参考代码----》这里使用类的方式进行封装

class OAuthQQ(object):"""QQ认证辅助工具"""def __init__(self, client_id=None, redirect_uri=None, state=None, client_secret=None):self.client_id = client_id or settings.QQ_CLIENT_IDself.redirect_uri = redirect_uri or settings.QQ_REDIRECT_URIself.state = state or settings.QQ_STATEself.client_secret = client_secret or settings.QQ_CLIENT_SECRETdef get_qq_login_url(self):"""关于QQ登陆获取url""""""Step1:获取Authorization Code请求地址:PC网站:https://graph.qq.com/oauth2.0/authorize请求方法:GET参数   是否必须    含义response_type 此值固定为“code”。client_id   appid。redirect_uristate"""params = {'response_type': 'code','client_id': self.client_id,'redirect_uri': self.redirect_uri,'state': self.state}"""urllib.parse.urlencode(query) 将query字典转换为url路径中的查询字符串"""# 字符串url的拼接url = 'https://graph.qq.com/oauth2.0/authorize?' + urlencode(params)return urldef get_access_token(self, code):"""获取access_token值""""""请求地址:PC网站:https://graph.qq.com/oauth2.0/token请求方法:GETgrant_type    在本步骤中,此值为“authorization_code”。client_id  appid。client_secret appkey。code authorization code。redirect_uri """params = {'grant_type': 'authorization_code','client_id': self.client_id,'client_secret': self.client_secret,'code': code,'redirect_uri': self.redirect_uri}url = 'https://graph.qq.com/oauth2.0/token?' + urlencode(params)"""urllib.request.urlopen(url, data=None)发送http请求,如果data为None,发送GET请求,如果data不为None,发送POST请求返回response响应对象,可以通过read()读取响应体数据,需要注意读取出的响应体数据为bytes类型"""response = urlopen(url)resp_data = response.read().decode()"""urllib.parse.parse_qs(qs)将qs查询字符串格式数据转换为python的字典"""resp_dict = parse_qs(resp_data)access_token = resp_dict.get('access_token')return access_token[0]def get_openid(self, access_token):"""openid的获取""""""1 请求地址PC网站:https://graph.qq.com/oauth2.0/me2 请求方法GET3 请求参数access_token"""url = 'https://graph.qq.com/oauth2.0/me?access_token=' + access_tokenresponse = urlopen(url)resp_data = response.read().decode()  # 字符串try:# 返回的数据 ‘callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} )\n’ 取出数据,并将字符串转为字典data = json.loads(resp_data[10:-4])print('data:%s' % data)except Exception:data = parse_qs(resp_data)logger.error('code=%s msg=%s' % (data.get('code'), data.get('msg')))raise QQAPIErroropenid = data.get('openid', None)return openid

第三方登陆--QQ登陆相关推荐

  1. 第三方登陆——QQ登陆详解

    申请地址 QQ互联:https://connect.qq.com/index.html 腾讯开放平台:https://open.tencent.com/ 注册账号 登陆 进入QQ互联,点击登陆 资料填 ...

  2. Android ShareSDK第三方微信QQ登陆

    最近公司需求做第三方登陆,本人将开发的时候注意事项给大家分享一下.希望以后可以减少大家进坑趟水. 首先请各位先去官网看继承文档 http://wiki.mob.com/Android_%E5%BF%A ...

  3. Unity ShareSDK接入QQ登陆微信登陆

    Unity 接入微信登陆QQ登陆 首先我们需要去下载ShareSDK http://www.mob.com/mobService/sharesdk 将下载下来的压缩包中的ShareSDK.unityp ...

  4. CAS单点登录-第三方登录[QQ、微信、CSDN、GitHub](十四)

    CAS单点登录-第三方登录[QQ.微信.CSDN.GitHub](十四) 注: 目前博文使用cas版本为5.1.5,由于5.2.x与5.1.x构建模式有差异,所以部分配置会有些偏差. 本章内容 简答介 ...

  5. QQ登陆第三方Demo(QQ互联)

    项目需要做QQ.微博等登陆第三方的功能,第一次接触,虽然官网上有sdk,接口写的很好,调用即可,但是没有文档,看着头疼就自己写了 步骤不多说: 一.申请AppID和AppKey,申请地址:点击打开链接 ...

  6. 五、Springboot 整合Shiro---03认证---第三方QQ登陆

    本章节基于:四.Springboot 整合Shiro---02认证---记住我 在开始之前,先要理解一下oauth2: 推荐去看一下(六.授权码模式):阮一峰讲解的oauth2 下面附上一张阮一峰博客 ...

  7. 第三方登陆(二)QQ登陆

    我们在讲qq登陆的集成. 首先qq登陆的注册问题,我们需要去qq互联申请账号, 地址:https://connect.qq.com/index.html 注册后在应用管理创建网站应用,设置回调地址: ...

  8. 第三方登陆-qq互联

    看到很多网站都有第三方登陆,使用业余时间自己也要实现一个第三方登陆的功能: 1.登陆qq互联的网站:https://connect.qq.com/index.html 2.点击头像进行资料申请 --- ...

  9. 解决第三方邮箱APP登陆QQ、163邮箱无法验证账户名或密码的问题(IOS、MacOS、Windows、Android)

    解决方法: 第一步:登陆QQ邮箱.163邮箱网页版,进入邮箱设置中打开IMAP/SMTP服务.  进入要登陆到第三方邮箱APP的个人163.QQ邮箱中,点击个人邮箱中的设置按钮,在里面找到IMAP.S ...

最新文章

  1. 树莓派应用实例6:测量土壤湿度(改进WEB发布)
  2. MySQL之SQL优化详解(二)
  3. 授权公钥登录,sudo权限脚本
  4. jQuery的单引号双引号
  5. Js 变量声明提升和函数声明提升
  6. 翻译神器拓宽语言沟通边界传神TransnBox、T1惊艳中国企业互联网CEO 峰会
  7. Magento搬家、换域名、重新安装教程
  8. 源码解析——消息机制
  9. 自动驾驶的Pipline -- 如何打造自动驾驶的数据闭环?(下)
  10. React实现H5横屏电子签名板
  11. 单片机c语言轻松入门 完整版,单片机C语言轻松入门
  12. win10虚拟服务器安装xp,win10安装xp虚拟机安装教程_win10安装xp虚拟机详细步骤
  13. Quasi_Newton
  14. 深度学习基础-损失函数详解
  15. 有关session生命周期
  16. Angular入门到精通系列教程(1) - Angular,Vue,React 选型
  17. js:contains函数
  18. EPICS记录参考--Select记录(sel)
  19. HDU 2191 汶川大地震
  20. 用计算机画画作品,小学生电脑绘画作品简单

热门文章

  1. 关于GoldWave给Vegas视频添加音频叠加的教程分享
  2. HTML元素的水平/垂直居中方式(简单代码和图)
  3. 视觉基础:关于机器视觉、机器学习及人工智能领域
  4. Android视图绘制流程完全解析(二)
  5. 开发WP版本的大菠萝英雄榜
  6. WINCE6.0去掉桌面快捷方式
  7. 高速PCB基础——电阻,电容,电感(第三讲)
  8. Android仿微信添加联系人列表,内附有截图和demo源码
  9. 校园招聘之Offer、三方协议、两方协议、劳动合同都是什么?怎样避免被坑?...
  10. 在腾讯云搭建代理服务器的全部过程