设为首页 收藏本站
查看: 774|回复: 0

[经验分享] 关于qq和新浪微博的第三方登陆|python|flask

[复制链接]

尚未签到

发表于 2015-4-22 11:11:33 | 显示全部楼层 |阅读模式
  前些日子研究了一下qq和新浪微博的第三方登陆的东西,发现其实难度并不大。来给大家分享一下我的经验和流程。
  不论是qq还是新浪微博的第三方登陆都是用了Oauth2.0授权流程,唯一不同的是qq多了一个openid的获取,多了一步。
  
  先介绍一下Oauth2.0的大致授权流程。在授权过程中大致有三个对象。一个是服务提供方(第三方网站)、一个是用户(将资源放在服务提供方存放的对象)、还有一个就是客户端(向服务提供放请求用户资源的对象)。首先,客户端向服务提供方发起请求,请求服务提供方的一个临时令牌,这个临时令牌是进行下一步的基础,服务提供方先要验证一下客户端的身份,验证成功后会给客户端所要的临时令牌。接下来客户端会引导用户进行授权操作,用户进入服务提供方提供的页面,完成授权以后服务提供方会给客户端一个访问令牌并调转回客户端的网页。通过访问令牌,客户端就可以获得用户在服务提供方上的若干权限。
  
  
  
  了解了Oauth2.0的授权机制,下面就开始介绍实例。显示新浪微博的。
  首先,要成为新浪微博的开发者,http://open.weibo.com/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97,这是申请开发者的大致流程,申请完成后就可以创建应用,然后新浪微博就会给你你的app_id和app_secret,这两样东西就是你的网站认证新浪微博的凭证,根据这个凭证你才能引导用户到新浪微博的授权界面。
  
  第一步,在你的网站上引导用户进入授权界面,实际上这一步包含了你的网站向服务提供方申请临时令牌和用户完成授权这两步。引导用户进入https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&response_type=code&redirect_url=YOUR_REGISTERDE_REDIRECT_URL
  上面的红字部分是要自己填入的信息。其他地方不用改动。用户输入用户名和密码,完成授权,之后会跳转到YOUR_REGISTERDE_REDIRECT_URL,并且会在url上多出”code=~~~~~~“的信息,这些是可以在后台通过GET方法获得的。

  
  第二步,通过第一步的code向服务提供方换取访问令牌,在新浪微博上就是access_token。在后台完成向https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_url=YOUR_REDIRECT_URL&code=CODE的请求。

  以上的红字是自己要填入的。通过上面的网址实际上是在用GET方法发起请求。响应会发回一个json字典,其中就有我们想要的access_token,字典中还有其他项,包括用户id,access_token的有效时间(秒为单位)等信息。
  实际上完成上边的两步后,我们就已经获得了我们想要的权限了。http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI,通过这个网址上的信息,再加上我们完成上边两步后所获的的东西,我们就可以实现想要的目的了。
  



1 #-*-coding:utf8 -*-
2 import urllib
3 import urllib2
4 import json
5 data1 = {"client_id":"","client_secret":""}
6 data1 = urllib.urlencode(data1)
7 url1 = "https://api.weibo.com/oauth2/access_token?grant_type=authorization_code&redirect_uri=&code=854e96627e23b6a31fea50cd242a681e"
8 #上边url1中的code是我手动在浏览器上运行授权url获取的,实际开发中是可以在网站后台获取的,就不用人工的去获取了
9
10
11 req1 = urllib2.Request(url1,data1)
12 response1 = urllib2.urlopen(req1)
13 #这里返回的是一个json格式的数据,通过解析可以从中获取access_token
14 response1 = json.loads(response1.read())
15 access_token = response1['access_token']
16 #print(access_token)
17
18
19 #一下是一个例子,以用户的名义发一条新浪微博
20 url2 = "https://api.weibo.com/2/statuses/update.json"
21 status = u"这是用来测试的,请直接忽略!"
22 status = status.encode("utf8")
23 data2  ={"source":"","access_token":access_token,"status":status}
24 #这里要注意source其实就是app_id
25 data2 = urllib.urlencode(data2)
26 req2 = urllib2.Request(url2,data2)
27 response2 = urllib2.urlopen(req2)
28 response2=json.loads(response2.read())
29 print(response2)
30 #这里用来获取响应信息
  
  
  
  
  
  
  下面介绍一下qq的流程,熟悉了新浪微博的授权流程,qq的流程就要好理解的多。qq的官方文档写得要比新浪微博的清楚明了的多,我就借用一下qq的文档。
  开始下面操作之前,你要去qq那里申请开发者许可,并申请要开发的网站或者应用以得到client_id和client_secret,还有你的redirect_url
  第一步,请求临时令牌,并引导用户授权。
  url:https://graph.qq.com/oauth2.0/authorize
  method:GET
DSC0000.png
DSC0001.png
  
  这一步的重点在获取code。
  
  第二步,请求访问令牌access_token
  url:https://graph.qq.com/oauth2.0/access_token
  method:GET
DSC0002.png
DSC0003.png
  
  这一步的重点在于获得access_token
  
  第三步,获得open_id,这是qq与新浪微博所不同的,也是多了这一步。
  url:https://graph.qq.com/oauth2.0/me
  method:GET
DSC0004.png
DSC0005.png
  完成了这一步就已经获得了所有要用到的参数,这样就可以完成我想要的所有权限了。
  http://wiki.open.qq.com/wiki/website/API%E5%88%97%E8%A1%A8,这是qq提供的所有能用的api,使用说明也都有,所有会用到的参数上面三步都已经得到了。这样工作就完成了。



#-*-coding:utf8-*-
import urllib
import urllib2
import json
response_type = "code"
client_id = ""
client_secret = ""
redirect_uri = ""
#以上的信息是要自己去申请开发网站时给开发者分配的
url_code = "authorization code"
url1 = "https://graph.qq.com/oauth2.0/token"

url1 = url1+"?grant_type=authorization_code&"+ \
"client_id="+client_id+ \
"&client_secret="+client_secret+ \
"&code=5CB3DB81F0718CE44ADD33A78F53E4A0"+ \
"&redirect_uri="+redirect_uri
#上面的code是我自己现在浏览器上手动完成第一步得到的,如果能在服务器上的话,是可以在后台完成对code的获取的,就不用这么麻烦了
req1=urllib2.Request(url1)
response1=urllib2.urlopen(req1)
m=((response1.read()).split('&'))[0]
access_token=(m.split('='))[1]
#print access_token
#这里由于返回的是一个字符串,所以对返回的字符串操作,从中获取access_token

url2="https://graph.qq.com/oauth2.0/me"
url2=url2+"?access_token="+access_token
req2=urllib2.Request(url2)
response2=urllib2.urlopen(req2)
dic=(response2.read())[10:-3]
ajson=json.loads(dic)
openid=ajson['openid']
#这里返回的是一个json字典,所以可以通过json模块解析其中的信息,以获得openid
#一下是一个例子,用来获取用户的基本信息
url3="https://graph.qq.com/user/get_user_info?"+ \
"access_token="+access_token+ \
"&oauth_consumer_key="+client_id+ \
"&openid="+openid
req3=urllib2.Request(url3)
response3=urllib2.urlopen(req3)
#data_dic=json.loads(response3.read())
print (response3.read()).encode('GB2312')
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59569-1-1.html 上篇帖子: Python学习 Part2:深入Python函数定义 下篇帖子: RTSP客户端模拟器(TCP方式,Python实现)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表