Twitter OAuth POST请求返回401错误

6

我正在尝试使用Twitter OAuth,但我的POST请求失败,并显示401Invalid OAuth Request)错误。

例如,如果我想要发布新的状态更新,我会向https://twitter.com/statuses/update.json发送一个HTTP POST请求,并使用下列参数:

status=Testing&oauth_version=1.0&oauth_token=xxx&
oauth_nonce=xxx&oauth_timestamp=xxx&oauth_signature=xxx&
oauth_consumer_key=xxx&in_reply_to=xxx&oauth_signature_method=HMAC-SHA1`

我的GET请求都正常工作。我在邮件列表上看到很多人有相同的问题,但我无法找到任何解决方案。

我正在使用oauth.py Python库。


你尝试使用HTTP而不是HTTPS时,它是否有效?只是为了确保问题。 - karlcow
3
我有同样的问题,结果发现我在 Twitter 应用程序配置中的“回调 URL”部分被某种方式清空了。当它为空时,会进入桌面模式并阻止使用动态回调的能力。您可以在所需设置中放置任何占位符文本,只要不是空白的即可。 - Jeff Standen
@JeffStanden 谢谢,解决了我的 Twitter 授权问题。 - Steve Moser
6个回答

4
我刚刚使用Java从头开始实现了Twitter OAuth API。获取和发布请求都可以正常工作。您可以使用此页面http://www.hueniverse.com/hueniverse/2008/10/beginners-gui-1.html来检查签名和HTTP标头。只需输入您的密钥和令牌并检查输出即可。似乎Twitter与本帖中描述的完全一样。请注意空格和UTF-8符号,例如Java将空格编码为“+”,但OAuth需要%20。

3

请确保您的应用程序访问类型为读写。

在您的应用程序设置页面上(例如:http://twitter.com/apps/edit/12345),有一个类似于以下内容的单选按钮字段:

默认访问类型:读写 / 只读

如果您选择“只读”,则状态更新API将返回401错误。


3

我同意Jrgns的答案。我也遇到了完全相同的问题。当阅读Twitter提供的示例时,实际上很清楚。但是他们的伪代码是误导性的。在Python中,这对我有用:

def encodekeyval(key, val):
    key = urllib.quote(key, '')
    val = urllib.quote(val, '')
    return urllib.quote(key + '=' + val, '')

def signature_base_string(urlstr, oauthdata):
    sigstr = 'POST&' + urllib.quote(urlstr,'') + '&'
    # retrieve "post" data as dictionary of name value pairs
    pdata = oauthdata.getpdata()
    # need to sort parameters
    pstr = '%26'.join([encodekeyval(key, pdata[key]) for key in sorted(pdata.keys())])
    return sigstr + pstr

2

我曾经遇到过同样的问题,直到意识到需要对基本字符串的参数进行两次编码。我的GET请求都正常工作,但我的POST请求,特别是状态更新,失败了。凭着直觉,我尝试了一个没有空格的POST请求,status参数,结果成功了。

在PHP中:

function encode($input) {
    return str_replace('+', ' ', str_replace('%7E', '~', rawurlencode($input)));
}

$query = array();
foreach($parameters as $name => $value) {
    $query[] = encode($name) . '=' .encode($value);
}
$base = encode(strtoupper($method)) . '&' .encode($norm_url) . '&' . 
encode(implode('&', $query));

注意在参数的名称和值周围以及整个查询字符串周围使用encode函数。空格应该变成%2520,而不仅仅是%20


也许这刚好解救了我的一天。我遇到了完全相同的问题,只是在 JavaScript 中。GET 可以工作,但 POST 不行... - selfawaresoup

0

我找到了解决方案,它对我有效。您必须在请求头中添加以下参数,并且它应该像以下代码一样(使用c#),不要使用&符号,而是用逗号(,)符号分隔参数。并且您必须在开头添加单词“OAuth”。

httpWebRequest.Headers[System.Net.HttpRequestHeader.Authorization] = "OAuth oauth_consumer_key=\"hAnZFaPKxXnJqdfLhDikdw\", oauth_nonce=\"4729687\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1284821989\", oauth_token=\"17596307-KH9iUzqTxaoa5576VjILkERgUxcqExRyXkfb8AsXy\", oauth_version=\"1.0\", oauth_signature=\"p8f5WTObefG1N9%2b8AlBji1pg18A%3d\"";

其他参数如“status”应写在请求正文中。


-8

很可能,签名无效。您必须遵循OAuth规范来生成签名(标准化参数,URL编码和cosumerSecret&oauthScret)。稍后会详细介绍......


19
以后?什么时候/在哪里是以后? - Rizwan Kassim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接