当前位置: 首页 > 学习笔记, 分享 > 正文

在Twitter应用中使用OAuth

这两天说上不了推的人很多,说以前的老api失效的人也很多,为什么不搭建新的api呢,只是一个动动手的问题,大家不要那么懒嘛。方法么网上已经是满天在飞了,无论是用twip或是gae,自己搜一把吧。引擎那东西摆那儿你不用,它岂不是很憋屈。 翻看月光博客,看到这篇文章很是通俗,转过来供参考和留档。

一、介绍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应用,注册地址:http://dev.twitter.com/apps/new 。注册之后,会得到自己Twitter应用的Consumer key和Consumer secret,都是一个字符串。之后就可以进行OAuth的认证过程:

  2.1、Twitter应用把Consumer key和Consumer secret放入HTTP请求中发送到Twitter API:https://api.twitter.com/oauth/request_token ,得到一个Request Token

  2.2、Twitter应用重定向用户浏览器到 https://api.twitter.com/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: https://api.twitter.com/oauth/access_token 取得一个Access Token。之后使用这个Access Token就可以调用各种Twitter API了。之后在使用每个Twitter API的时候,把Access Token附加于每一个Twitter API的HTTP请求中即可,Twitter API的使用,请见月光博客:http://www.williamlong.info/archives/2152.html 。Twitter应用可以把这个Access Token保存下来,以便以后直接使用,不需要用户重复去Twitter官方网站授权了

  三、使用OAuth

  由于OAuth的认证比较复杂,并且HTTP参数繁多。如果从头开始做OAuth势必需要把各个参数正确的并按一定顺序的填写到HTTP请求中。好在我们有各种开源的OAuth库(参考:http://dev.twitter.com/pages/oauth_libraries )可以使用。在这里,我把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=https://api.twitter.com/oauth/request_token

    access.token.verb=POST

    access.token.url=https://api.twitter.com/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 = null;

  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 https://api.twitter.com/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, “https://api.twitter.com/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, “https://api.twitter.com/statuses/update.xml”);

    req.addBodyParameter(“status”, “我们Test”);//发推内容:我们Test

    sb.signRequest(req, tk);

    resp = req.send(proxy);

    System.out.println(resp.getBody());//我们看到,发推成功。在Twitter中也能看到程序发的推了。

原文出自月光博客 地址:http://www.williamlong.info/archives/2185.html

本文固定链接: http://exsbn.com/post/265 | 御剑独舞

该日志由 xizi 于2010年09月03日发表在 学习笔记, 分享 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 在Twitter应用中使用OAuth | 御剑独舞
关键字: , , ,
【上一篇】
【下一篇】

在Twitter应用中使用OAuth:目前有20 条留言

  1. 13楼
    joyla:

    要上其实很简单ssh 直接连接
    joyla新发表了大作:博客华丽转身-按需个性满足篇

    2010-09-04 9:56 下午 [回复]
    • 嗯 不算麻烦,事在人为嘛

      2010-09-04 10:24 下午 [回复]
  2. 12楼
    ZDAvril:

    玩推特还要翻墙。有点小麻烦。
    ZDAvril新发表了大作:“精简版”滚动到顶部和底部的jQuery效果

    2010-09-04 6:59 下午 [回复]
  3. 11楼
    奶牛:

    还是蛮喜欢推特滴~~~

    2010-09-04 5:18 下午 [回复]
  4. 10楼
    vastar:

    曾经玩过几天就没玩了喔。因为可玩的东西太过了~

    2010-09-04 5:14 下午 [回复]
  5. 9楼
    七七:

    嗯,了解一下..

    2010-09-04 4:53 下午 [回复]
  6. 8楼
    huangjun:

    一直没想翻墙过去看看。

    2010-09-04 3:55 下午 [回复]
  7. 偶还是在玩我的博客, 不怎么玩这些东西. 貌似这个被墙了吧.

    2010-09-04 3:13 下午 [回复]
  8. 6楼
    学夫子:

    我一直都很悲剧,因为根本不能上推特,也懒得翻墙了
    学夫子新发表了大作:数学启示之美与不美

    2010-09-04 9:07 上午 [回复]
  9. 5楼
    xizi:

    这个是被天朝打压了的产物,不过信息量不错。使用要求被国内诸多阉割版微博高一些。起码需要f**k GFW

    2010-09-04 12:22 上午 [回复]
  10. 4楼
    哲哲:

    这个在中国意义不大·不过在使用TweetDeck这样的客户端就不错了··oauth认证下·然后像用QQ一样用twitter了·

    2010-09-03 7:24 下午 [回复]
  11. 地板
    8101:

    要翻墙

    2010-09-03 5:55 下午 [回复]
    • 我喜欢跨越功夫网

      2010-09-04 12:19 上午 [回复]
  12. 板凳
    老张博客:

    这个不得要去翻墙吗????
    老张博客新发表了大作:让你的WordPress标签云更能体现用户体验

    2010-09-03 4:57 下午 [回复]
    • 翻墙或者墙内利用API

      2010-09-04 12:19 上午 [回复]
  13. 沙发
    winw:

    一直没有推,因为嫌翻墙太麻烦
    winw新发表了大作:不把我的刘海放出来就不让你上我的床

    2010-09-03 4:40 下午 [回复]

发表评论


CommentLuv badge

NO SPAMS Time limit is exhausted. Please reload the CAPTCHA.

快捷键:Ctrl+Enter