hi,friend

关于qq和新浪微博的第三方登陆|python|flask

前些日子研究了一下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

 

这一步的重点在获取code。

 

第二步,请求访问令牌access_token

url:https://graph.qq.com/oauth2.0/access_token

method:GET

 

这一步的重点在于获得access_token

 

第三步,获得open_id,这是qq与新浪微博所不同的,也是多了这一步。

url:https://graph.qq.com/oauth2.0/me

method:GET

完成了这一步就已经获得了所有要用到的参数,这样就可以完成我想要的所有权限了。

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')

 

 

posted @ 2013-11-13 21:51  GresonFrank  阅读(4021)  评论(2编辑  收藏  举报