获得401在Twitter的OAuth POST请求
-
22-08-2019 - |
题
我试图使用Twitter的OAuth和我POST
请求与401
(Invalid OAuth Request
)错误而失败。
例如,如果我想发布一个新状态更新,我发送HTTP请求POST
使用以下参数,以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库。
解决方案
最有可能的,该签名无效。你必须按照有关如何生成签名的OAuth规范(标准化参数,URL编码,并cosumerSecret&oauthScret。在此以后......
其他提示
我刚刚完成了从头开始实现使用Java的Twitter OAuth的API。 GET和POST请求的工作确定。您可以使用此页面 http://www.hueniverse.com /hueniverse/2008/10/beginners-gui-1.html 检查签名和HTTP头。只需输入你的钥匙和令牌,并检查输出。看来Twitter的作品完全一样对这个职位描述。小心用空格和UTF-8码元,例如爪哇编码空间为“+”,但OAuth的需要%20
请确保您的应用程序访问类型是读写。 在您的应用程序设置页面(例如: http://twitter.com/apps/edit/12345)有一个单选按钮字段是这样的:
默认访问类型:读与写/只读
如果您勾选“只读”,那么状态更新API将返回401。
我第二答案由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
我有同样的问题,直到我意识到需要的参数为基础的字符串被两次编码。我的GET请求都工作得很好,但我的职位,特别是状态更新,失败了。上预感我尝试了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
。
我找到了解决方案,它为我工作,你必须在请求头中添加以下paramters,它应该像以下(C#代码),DONOT使用&符号,用逗号,而不是单独的参数(,)符号。你必须在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 \“”;
和其他参数,如“状态”应在请求的主体中被写入。