如何从 Web 应用程序访问仅限身份验证的 Twitter API 方法

Posted

技术标签:

【中文标题】如何从 Web 应用程序访问仅限身份验证的 Twitter API 方法【英文标题】:How can I access auth-only Twitter API methods from a web application 【发布时间】:2011-06-12 17:41:05 【问题描述】:

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

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

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

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

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

我使用表单的 URL 访问 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 对话框。知道我做错了什么吗?我希望这是一些简单得令人尴尬的事情,比如“忘记一个重要参数”......

【问题讨论】:

【参考方案1】:

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

我使用http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iv-signing-requests/ 上非常有用的交互式请求检查器构建了它

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

curl -v -H '授权: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

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

    Set Headers with jQuery.ajax and JSONP? Modify HTTP Headers for a JSONP request Using only JQuery to update Twitter (OAuth)

您的请求看起来有几个问题;它缺少用户的 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=1300728065&oauth_signature =HMAC-SHA1&oauth_version=1.0&oauth_signature=XXXXXXXXXXXXXXXX%3D

【讨论】:

非常好!这对您来说效果好吗?您还在使用这种方法吗?【参考方案2】:

我正在努力解决从 Jquery 发出 JSONP 请求的类似问题,上面的答案有助于添加我为实现我的解决方案所做的工作。

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

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

现在有两个问题:

    无法编辑 JSONP 标头 需要作为 oauth 的一部分发送的签名参数与回调 = 有问题? (使用 JSONP 的常规方式)。

正如上面的答案所说,1 不能完成。 另外,回调=?将不起作用,因为必须对参数列表进行签名,并且在将请求发送到远程服务器 Jquery 时替换回调 =?一些名称,如回调 = 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);

使用参数映射中的基本 url 和键值对创建 url

jQuery.ajax( 
               url: url, 
               dataType: "jsonp",
               type: "GET",
              );

【讨论】:

以上是关于如何从 Web 应用程序访问仅限身份验证的 Twitter API 方法的主要内容,如果未能解决你的问题,请参考以下文章

从基于 Sharepoint 声明的身份验证 Web 应用程序中的代码访问 Windows 共享

适用于移动设备和 Web 的安全 API

设计令牌身份验证 - 如何使用javascript访问响应头信息?

从 React Native webView 自动使用 Web 应用程序进行身份验证

iPhone Webservice 身份验证和访问令牌

如何从 sharepoint 2013 Web 服务和 Active Directory 对用户进行身份验证