Получение 401 в Twitter запросов OAuth POST - PullRequest
6 голосов
/ 27 марта 2009

Я пытаюсь использовать 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.

Ответы [ 6 ]

4 голосов
/ 17 апреля 2009

Я только что завершил реализацию Twitter OAuth API с нуля, используя Java. Получать и публиковать запросы работают нормально. Вы можете использовать эту страницу http://www.hueniverse.com/hueniverse/2008/10/beginners-gui-1.html для проверки подписи и заголовков HTTP. Просто введите свои ключи и токены и проверьте вывод. Кажется, твиттер работает точно так, как описано в этом посте. Будьте осторожны с пробелами и символами UTF-8, например, Java кодирует пробел как «+», но для OAuth требуется% 20

3 голосов
/ 03 января 2011

Я второй ответ 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 голосов
/ 19 марта 2010

Убедитесь, что ваш тип доступа к приложению - чтение и запись. На странице настроек вашего приложения (например, http://twitter.com/apps/edit/12345) есть поле переключателя, например:

Тип доступа по умолчанию: чтение и запись / только чтение

Если вы установите флажок «Только для чтения», API обновления статуса вернет 401.

2 голосов
/ 30 января 2010

У меня были те же проблемы, пока я не понял, что параметры должны быть дважды закодированы для базовой строки. Все мои запросы 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.

0 голосов
/ 23 октября 2010

Я нашел решение, и оно работает для меня. Вы должны добавить следующие параметры в заголовок запроса, и он должен выглядеть следующим образом (код c #), не использовать и подписывать, а вместо этого разделять параметры знаком запятой (,). и вы должны добавить слово "OAuth" в begeing.

httpWebRequest.Headers [System.Net.HttpRequestHeader.Authorization] = "OAuth oauth_consumer_key = \" hAnZFaPKxXnJqdfLhDikdw \ ", oauth_nonce = \" 4729687 \, \ \ \ \} \ ", oauth_token = \" 17596307-KH9iUzqTxaoa5576VjILkERgUxcqExRyXkfb8AsXy \ ", oauth_version = \" 1.0 \ ", oauth_signature = \" p8f5WTObefG1N9% 2b818 * 100%

и другие параметры, такие как «status», должны быть записаны в теле запроса.

0 голосов
/ 15 апреля 2009

Скорее всего, подпись недействительна. Вы должны следовать спецификации OAuth о том, как генерировать подпись (нормализованные параметры, URLencoding и cosumerSecret & oauthScret. Подробнее об этом позже ......

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...