我正在尝试使用Twitter OAuth,但我的POST
请求失败并出现401
(Invalid OAuth Request
)错误。
例如,如果我想发布新的状态更新,我将使用以下参数向POST
发送HTTP https://twitter.com/statuses/update.json
请求 -
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库。
答案 0 :(得分:4)
我刚刚使用Java从头开始实现twitter OAuth API。获取和发布请求工作正常。您可以使用此页面http://www.hueniverse.com/hueniverse/2008/10/beginners-gui-1.html来检查签名和HTTP标头。只需输入您的密钥和令牌并检查输出。看来twitter的工作原理与本文所描述的完全相同。注意空格和UTF-8符号,例如Java将空格编码为“+”,但OAuth需要%20
答案 1 :(得分:3)
确保您的应用访问类型已读取&写。 在您的应用设置页面(例如http://twitter.com/apps/edit/12345)上有一个单选按钮字段:
默认访问类型:阅读&写/只读
如果您选中“只读”,则状态更新API将返回401。
答案 2 :(得分: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
答案 3 :(得分:2)
我遇到了同样的问题,直到我意识到参数需要为基本字符串编码两次。我的GET请求一切正常,但我的POST,特别是状态更新失败了。在预感中,我在status
参数中尝试了一个没有空格的POST,并且它有效。
在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
。
答案 4 :(得分:0)
我找到了解决方案并且它适用于我,您必须在请求标头中添加以下参数,它应该如下所示(c#代码),不要使用&标志,而不是用逗号(,)符号分隔参数。并且您必须在beginging中添加“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'应写在请求正文中。
答案 5 :(得分:-8)
最有可能的是,签名无效。你必须遵循关于如何生成签名的OAuth规范(规范化参数,URLencoding和cosumerSecret& oauthScret。稍后会详细介绍......