青青子衿, 悠悠我心, 但为君故, 沉吟至今
在Twitter应用中使用OAuth
Twitter官方宣布将在日终止对Basic Authorization验证方式的支持,全面启用OAuth的认证方式,广大使用API的天朝网民纷纷表示鸭梨很大,众多使用Basic Auth认证的第三方程序如何适应这个新的变化,本文将会介绍如何在Twitter应用中使用OAuth认证。 一、介绍OAuth 在Twitter未支持OAuth之前,使用的是Basic Auth认证。Basic Auth要求Twitter应用把用户名和口令直接附加在HTTP或HTTPS协议头中发送给Twitter API。这样,Twitter应用势必要求用户在其应用中输入自己的Twitter用户名和口令,从而可以把Twitter的用户名和口令附加在HTTP(S)协议中发送给Twitter。这样Twitter应用开发者就能知道使用了他的Twitter应用的用户的所有用户名和密码,这样开发者就能随意使用这些Twitter账号登陆Twitter做任何操作了。比如,可以修改用户的Twitter密码,甚至直接去Twitter的Settings中删除这个帐号。这将带来潜在的安全性问题。 而使用OAuth,Twitter应用无需知道用户的Twitter口令,只需要得到Twitter和用户双方的授权信息(后面会说这个授权信息&&其实就是Token)即可。这样,Twitter应用开发者就不知道用户的Twitter口令,只能使用这个授权信息(Token)做有限的操作,无法修改用户的Twitter口令,也无法删除用户的Twitter账号。这在安全性上有了很大提高。 二、OAuth认证流程 要使用OAuth,首先要去Twitter中注册一个自己的Twitter应用,注册地址: 。注册之后,会得到自己Twitter应用的Consumer key和Consumer secret,都是一个字符串。之后就可以进行OAuth的认证过程: 2.1、Twitter应用把Consumer key和Consumer secret放入HTTP请求中发送到Twitter API: /oauth/request_token ,得到一个Request Token 2.2、Twitter应用重定向用户浏览器到 /oauth/authorize?oauth_token=&Request Token& ,其中&Request Token&为在2.1中取得的Request Token 2.3、Twitter官方网站上提示用户登录,之后提示用户选择是否允许此Twitter应用访问自己的账号。这个选择一次即可,之后在2.5中Twitter应用可以记录用户的选择(正因为OAuth的认证过程必须在官方网站上进行,所以对于某些国家的普通民众来说,相比Basic Auth是一个不方便的地方) 2.4、用户选择允许之后,浏览器被重定向到Callback URL,并附加Verifier参数和新的Token。这个Callback URL是Twitter应用用于接收Verifier和新的Token的地址。Callback URL是注册Twitter应用需要填写的,也可以在2.1中在HTTP请求中和Consumer key和Consumer secret一起发送到Twitter API。由于Callback URL是浏览器访问的,并不是由Twitter服务器访问的,所以如果需要做测试的话,这个Callback URL可以是局域网地址或者是本机上的Web服务地址,比如可以是 http://localhost:8080/receive.jsp 。 2.5、Twitter应用取得Verifier和新的Token后,把他们一起发送给Twitter API: /oauth/access_token 取得一个Access Token。之后使用这个Access Token就可以调用各种Twitter API了。之后在使用每个Twitter API的时候,把Access Token附加于每一个Twitter API的HTTP请求中即可,Twitter API的使用,请见月光博客: 。Twitter应用可以把这个Access Token保存下来,以便以后直接使用,不需要用户重复去Twitter官方网站授权了 三、使用OAuth 由于OAuth的认证比较复杂,并且HTTP参数繁多。如果从头开始做OAuth势必需要把各个参数正确的并按一定顺序的填写到HTTP请求中。好在我们有各种开源的OAuth库(参考: )可以使用。在这里,我把OAuth的Java库Scribe作为例子进行介绍(考虑到国内情况,我对Scribe做了一些修改,使其支持代理服务器): 3.1、创建一个twitter.properties,其中的内容为: consumer.key=&Twitter应用的Consumer Key,可以去Twitter官方网站中自己的Twitter应用的参数中找到& consumer.secret=&Twitter应用的Consumer Secret& request.token.verb=POST request.token.url=/oauth/request_token access.token.verb=POST access.token.url=/oauth/access_token callback.url=http://localhost:8080/receive.jsp 3.2、读取twitter.properties到Properties对象中: Properties tp = new Properties(); tp.load(TwOAuth.class.getResourceAsStream(&/twitter.properties&)); BufferedReader stdinRd = new BufferedReader(new InputStreamReader(System.in)); 3.3、生成代理服务其对象(国内用户使用,因为国内无法直接访问Twitter API): Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(&HTTP代理服务器地址&, HTTP代理服务器端口));//如果不使用代理服务器,请写为Proxy proxy = 3.4、取得Request Token(对应2.1): Scribe sb = new Scribe(tp); Token tk = sb.getRequestToken(proxy); 3.5、重定向用户浏览器(由于例子是命令行程序,所以直接打印出访问地址,由用户自己打开浏览器访问),返回Callback URL后,提示用户输入Token和Verifier(如果是Web程序,可以直接通过Callback URL中获取Token和Verifier。Twitter认证之后,浏览器地址栏中就会出现Token和Verifier)(对应2.2、2.3、2.4): System.out.println(&Please visit /oauth/authorize?oauth_token=& + tk.getToken() + & and get the token and verifier, then input the token:&); tk = new Token(stdinRd.readLine(), tk.getSecret()); System.out.println(&And please input the verifier:&); 3.6、发送Token和Verifier,取得Access Token(对应2.5): tk = sb.getAccessToken(tk, stdinRd.readLine(), proxy); 3.7、可以开始使用各种Twitter API了,首先我们试验取得用户自己的时间线,结果以Xml格式返回并打印出来: Request req = new Request(Request.Verb.GET, &/statuses/user_timeline.xml&); sb.signRequest(req, tk);//把Access Token附加到HTTP请求中 Response resp = req.send(proxy); System.out.println(resp.getBody());//我们看到打印出很多信息,其中有很完整的时间线信息,只要解析这个Xml就能得到所有的信息 3.8、再测试更新自己的状态(发推): req = new Request(Request.Verb.POST, &/statuses/update.xml&); req.addBodyParameter(&status&, &我们Test&);//发推内容:我们Test sb.signRequest(req, tk); resp = req.send(proxy); System.out.println(resp.getBody());//我们看到,发推成功。在Twitter中也能看到程序发的推了 四、后记 OAuth的基本介绍结束了,最后附上Java版OAuth的源代码和修改过支持代理服务器的Java OAuth库Scribe()。其他语言应该也是类似的,各种语言的OAuth库可以参考: 。望大家做出国内直接可用的优秀Twitter应用。 投稿人Twitter: @davidsky2012 ,投稿人Google Reader:
除非注明,文章均为原创,转载请以链接形式标明本文地址
本文地址:
很好的介绍啊!
Twitter在国内貌似上不了哦!困惑中...
有点高深了~
看了很有收获,月光都是这个时间更新吗
好像在中国大陆上不了twitter,请问你们是怎么上的呢?
.newtwittermaker
您好,我最近在做这方面的东西,可是认证这块一直没弄懂。关于你的2.1-2.5,跟官网的有些出入,官网的需要发送好几个参数,并且参数及其顺序都有严格的要求,尤其是signature,如果method选的是HMAC-SHA1的话是不是得自己利用算法工具进行签名,然后才能获得这个值呢。
而且它的data 与 key 也是要自己构造,key还好,好像是2个secret连接起来,可是data,它那个上面说是说了,但是还是不知道怎么构造。能通过具体例子详细介绍介绍吗? 谢谢lehui99 于
20:38:58 回复为了介绍方便,参数确实忽略了许多,只保留了最重要的参数。具体的例子在文章中有程序,直接使用参数应该是完整的,我自己就是这么用的。呵呵 于
16:43:56 回复你好,请问你弄成功了吗?求!
终于能这么靠前了
原来评论里不能加网址的啊
现在国内有什么办法上twitter吗?一直听别人说起,但却不知道怎么可以登陆。。。sundy 于
9:23:36 回复fanqiang 就能上
来看看!推特很少上!因为翻墙麻烦!
终于能这么靠前了,呵呵!支持月光大哥... 多多的学习。
貌似有些复杂 还是不折腾了
现在上twitter少了
不懂怎么翻墙?学会了试试
.suannaiji
好吧,我不懂……一般都是ssh的
.waffler22
太复杂。希望6月30日不是推特中文圈的大限。
.whatisjava
您好,请教一下您那个main函数里头需要手动输入什么东西呢?就那个BufferedReader stdinRd = new BufferedReader(new InputStreamReader(System.in));
现在微博越来越流行了
貌似以后登录Twitter都要翻墙了。
第一次知道这个东西。
我还没注册呢,所以看不懂。马上去注册一个。
Twitter 好久没用了.
终于能这么靠前了,呵呵!支持月光大哥...
过来看看,支持一下
月光最近很低调,都是发布其他人的投稿了.
月光大哥,能更新一篇在symbian上用gravity上登陆的文章嘛?现在网上的教程都太滥了viktor 于
0:31:14 回复很多文章都是别人投稿的,不是博主本人写的。一个人哪有那么多精力什么都去研究。自己研究一下是好。
每天逛月光 都会有收获----月光博客
可以写的详细点么 2.1怎么弄?
Twitter,要翻墙,轻功不好。。。爱敏记 于
0:16:03 回复多来月光看看,学学功夫,翻墙还是小意思猫小黑 于
0:51:10 回复多翻墙,有益健康,哈哈。猫小黑 于
0:59:04 回复翻个墙,过来顶一下。呵呵 于
16:43:06 回复9楼,你好,请问你弄成功了吗?
赞助商广告
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享. 转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议.(humansexly)
(其实也许未必不是非得这样)
(尚玉婷_)
第三方登录:建议用代理服务器软件了。
其他***(共1个回答)
这个看看去
分享几个全球最好的代理服务器列表(分享
分享几个全球最好的代理服务器列表(分享
是一个公布高速代理的网站,它的登陆名和密码一...
代理IP可以到搜索网站查找下相关资料会找到你所需的***,如百度,GOOGLE等搜索网站,
使用 PacketiX *** Client Manager 软件可以达到你的目的,免费的。
如果光是代理服务器的IP地址,用不了几天就被封了~
可以再 设置中看到的 初始密码 你可以更改
右键单击IE--属性--连接--设置--使用代理服务器--根据要求添加即可
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区