如何从Web应用程序访问仅支持auth的Twitter API方法

时间:2011-01-20 20:24:15

标签: json api twitter oauth jqtouch

我有一个适用于iPhone的网络应用程序,它最终会在PhoneGap应用程序中运行 - 但是现在我在Safari中运行它。

该应用程序需要访问Twitter好友的推文,包括私人推文。所以我使用Scribe库实现了OAuth。我成功地将用户反弹到Twitter,让他们进行身份验证,然后反弹。

此时,Web应用程序具有oAuth凭据(密钥和令牌),它在本地持久存在。从这里开始,我希望用户使用Twitter状态/ user_timeline.json方法来获取特定用户的推文。我有使用JSONP请求的应用程序成功执行此操作与未受保护的推文;当它访问私人Twitter提要的时间轴时,应用程序中会出现HTTP基本身份验证对话框。

我认为我需要向Twitter提供OAuth凭据,以便我的Web应用程序可以识别和验证自己。 Twitter建议通过添加HTTP Authorization标头来实现这一点,但由于我正在使用JSONP进行请求,因此我认为这不是我的选择。我是否正确地假设这个?

因此,我的选项似乎是将oAuth凭据作为查询字符串参数(Twitter建议反对,但文档建议仍然支持);或通过中间服务器代理所有推文。我宁愿避开后者。

我使用

形式的网址访问Twitter API

http://api.twitter.com/1/statuses/user_timeline.json?user_id=29191439&oauth_nonce=XXXXXXXXXXX&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1272323042&oauth_consumer_key=XXXXXXXXXX&oauth_signature=XXXXXXXXXX&oauth_version=1.0

当user_id是公共用户时,这很好用。当user_id是私人用户时,我会获得HTTP Basic Auth对话框。知道我做错了什么吗?我希望它像“忘记一个重要的参数”一样简单尴尬......

2 个答案:

答案 0 :(得分:4)

根据http://dev.twitter.com/pages/auth#auth-request,oAuth节必须准确无误 - 我最终建立了一个授权:标题,我可以先用curl检查。

我使用http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iv-signing-requests/

上真正有用的互动请求检查器构建了它

以下是受保护用户的朋友API请求:

curl -v -H 'Authorization: OAuth realm="https://api.twitter.com/1/friends/ids.json", oauth_consumer_key="XXXXXXXXXXXXXXXX", oauth_token="XXXXXXXXXXXXXXXX", oauth_nonce="XXXXXXXXXXXXXXXX", oauth_timestamp="1300728665", oauth_signature_method="HMAC-SHA1", oauth_version="1.0", oauth_signature="XXXXXXXXXXXXXXXX%3D"' https://api.twitter.com/1/friends/ids.json?user_id=254723679

值得重新思考,正如您尝试的那样,而不是通过例如设置授权标头。 jquery的beforeSend函数,对于跨域JSONP请求(不能添加HTTP头),您可以通过将所有相关的键/值对放入GET请求来发出oAuth请求。这应该有助于其他各种提问者,例如

  1. Set Headers with jQuery.ajax and JSONP?
  2. Modify HTTP Headers for a JSONP request
  3. Using only JQuery to update Twitter (OAuth)
  4. 您的请求看起来有几个问题;它缺少用户的oauth_token加上oauth_signature看起来不像是base64编码的(因为它分别缺少十六进制编码=或==,%3或%3D%3D)。

    这是使用oAuth编码的查询字符串参数的GET等效项,您可以在跨域JSONP调用中使用它:

    https://api.twitter.com/1/friends/ids.json?user_id=254723679&realm=https://api.twitter.com/1/friends/ids.json&oauth_consumer_key=XXXXXXXXXXXXXXXX&oauth_token=XXXXXXXXXXXXXXXX&oauth_nonce=XXXXXXXXXXXXXXXX&oauth_timestamp=1300728665&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_signature=XXXXXXXXXXXXXXXX%3D

答案 1 :(得分:0)

我正在努力解决从Jquery发出JSONP请求的类似问题,上面的回答只是为了补充我为实现我的解决方案而做的事情。

我正在服务器到服务器oauth然后我发送oauth令牌,秘密,消费者密钥和秘密(这是我们放置代理以保护消费者秘密时的临时解决方案)。您可以将其替换为令牌在客户端获取代码。

Oauth.js和Sha1.js download link! 生成签名后。

现在有两个问题:

  1. 无法编辑JSONP标头
  2. 需要作为oauth的一部分发送的签名参数有回调的问题=? (使用JSONP的常规方法)。
  3. 如上所述,答案说1不能做。 另外,回调=?将无法工作,因为参数列表必须签名,并在将请求发送到远程服务器时Jquery替换callback =?某些名称,如callback = Jquery1232453234。因此必须使用命名处理程序。

    function my_twitter_resp_handler(data){
        console.log(JSON.stringify(data));
    }
    

    和getJSON不能使用命名函数处理程序,因此我使用了

    var accessor = {
                       consumerSecret: XXXXXXXXXXXXXXXXXXXXXX,
                       tokenSecret   : XXXXXXXXXXXXXXXXXXXXXX
    
                     };
    
      var message = {  action: "https://api.twitter.com/1/statuses/home_timeline.json",
                       method: "GET",
                       parameters: []
                    };
      message.parameters.push(['realm', "https://api.twitter.com/1/statuses/home_timeline.json"]);
      message.parameters.push(['oauth_version', '1.0']);
      message.parameters.push(['oauth_signature_method', 'HMAC-SHA1']);
      message.parameters.push(['oauth_consumer_key', XXXXXXXXXXXXXXXX]);
      message.parameters.push(['oauth_token', XXXXXXXXXXXXXXX]);
      message.parameters.push(['callback', 'my_twitter_resp_handler']);
    
      OAuth.completeRequest(message, accessor);
    
      var parameterMap = OAuth.getParameterMap(message.parameters);
    

    使用参数地图

    中的基本网址和键值对创建网址
    jQuery.ajax({ 
                   url: url, 
                   dataType: "jsonp",
                   type: "GET",
                  });