Почему я не могу пройти аутентификацию с помощью OAuth?

Я написал очень простое приложение для обновления моего статуса в твиттере при определенных условиях. Я использовал документацию Twitter, чтобы понять требования к созданию подписи OAuth, а также как структурировать заголовок авторизации. Затем я отправляю запрос с помощью cURL в PHP.

Используя инструменты OAuth на сайте разработчиков Twitter, я сравнил базовую строку подписи и заголовок авторизации, и оба они абсолютно одинаковы:

Базовая строка подписи

POST&https%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.json&oauth_consumer_key%3DYNxxxxxxxxxxxWnfI6HA%26oauth_nonce%3D31077a3c7b7bee4e4c7e2b5185041c12%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1340729904%26oauth_token%3D2991771-4csoiO2fxmWgSxxxxxxxxxxDjWj2AbyxATtiuadNE%26oauth_version%3D1.0%26status%3Dblah%2520test%2520blah.

Заголовок авторизации

Authorization: OAuth oauth_consumer_key="YN4FLBxxxxxxxxxxI6HA", oauth_nonce="31077a3c7b7bee4e4c7e2b5185041c12", oauth_signature="M2cXepcxxxxxxxxxxAImeAjE%2FHc%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1340729904", oauth_token="2991771-4cxxxxxxxxxxSmRvjzMoooMDjWj2AbyxATtiuadNE", oauth_version="1.0"

Очевидно, я заменил некоторые символы с x, чтобы скрыть мои данные, но сравнение двух символов для символов дает точно такой же результат. Для справки, я жестко запрограммировал метку времени и одноразовый номер, которые генерирует инструмент OAuth, чтобы мои значения могли быть одинаковыми для проверки. Мой уровень доступа установлен на чтение и запись. На той же странице есть последний пример — команда для запуска с cURL в командной строке. Когда я запускаю эту команду, она работает отлично и без проблем публикует сообщения в моем твиттере.

Имея это в виду, я считаю, что все, что я создал до сих пор, прекрасно, и не думаю, что есть большой смысл публиковать код, который генерирует детали, упомянутые ранее. Однако код, который я использую для вызова с использованием cURL, я думаю, является виновником, но не могу сказать, почему:

<?php
// ...
$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $baseUrl);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: $header"));
curl_setopt($curl, CURLOPT_POSTFIELDS, array('status' => $status));
$result = json_decode(curl_exec($curl));
curl_close($curl);

var_dump($result);

Обратите внимание, что $baseUrl, $headerи $status— это те же самые переменные, которые использовались при создании базовой строки подписи и заголовка авторизации, которые отлично совпали.

Вывод страницы при запуске:

object(stdClass)#1 (2) { ["error"]=> string(34) "Could not authenticate with OAuth." ["request"]=> string(23) "/1/statuses/update.json" }

Я надеюсь, что здесь достаточно подробностей, чтобы кто-то указал мне правильное направление!

5
задан LeonardChallis 26 June 2012 в 17:21
поделиться