Как получить доступ к методам Twitter API только для аутентификации из веб-приложения - PullRequest
6 голосов
/ 20 января 2011

У меня есть веб-приложение для iPhone, которое в конечном итоге будет работать в приложении PhoneGap, но сейчас я запускаю его в Safari.

Приложению требуется доступ к твитам друзей Твиттера, включая приватные твиты. Итак, я реализовал OAuth с использованием библиотеки Scribe. Я успешно возвращаю пользователей в Твиттер, проверяю их подлинность и возвращаюсь обратно.

На данный момент веб-приложение имеет учетные данные oAuth (ключ и токен), которые сохраняются локально. С этого момента я хотел бы использовать метод stat stats / user_timeline.json в Твиттере, чтобы получать твиты для конкретного пользователя. У меня есть приложение, использующее запросы JSONP для успешного выполнения этого с незащищенными твитами; при обращении к временной шкале частного канала Twitter в приложении появляется диалоговое окно базовой аутентификации HTTP.

Я считаю, что мне нужно предоставить учетные данные OAuth для Twitter, чтобы мое веб-приложение могло идентифицировать и аутентифицировать себя. Twitter рекомендует сделать это путем добавления заголовка HTTP-авторизации, но, поскольку я использую JSONP для запроса, я не думаю, что это вариант для меня. Я прав, предполагая это?

Таким образом, мои параметры, по-видимому, либо помещают учетные данные oAuth в качестве параметров строки запроса (против чего рекомендует Twitter, но документация все еще поддерживает); или прокси всех твитов через промежуточный сервер. Я предпочел бы избежать последнего.

Я получаю доступ к API Twitter, используя URL-адреса вида

http://api.twitter.com/1/statuses/user_timeline.json?user_id=29191439&oauth_nonce=XXXXXXXXXXX&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1272323042&oauth_consumer_key=XXXXXXXXXX&oauth_signature=XXXXXXXXXX&oauth_version=1.0

Когда user_id является публичным пользователем, это работает нормально. Когда user_id является частным пользователем, я получаю диалог HTTP Basic Auth. Есть идеи, что я делаю не так? Я надеюсь, что это что-то невероятно простое, например, «забыть важный параметр» ...

Ответы [ 2 ]

4 голосов
/ 22 марта 2011

Раздел oAuth должен быть точным, согласно http://dev.twitter.com/pages/auth#auth-request - в итоге я создал Авторизацию: заголовок, который я мог сначала проверить с помощью curl.

Я построил его с помощью действительно полезной интерактивной проверки запросов на http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iv-signing-requests/

Вот запрос API друзей для защищенного пользователя:

curl -v -H 'Authorization: OAuth realm="https://api.twitter.com/1/friends/ids.json", oauth_consumer_key="XXXXXXXXXXXXXXXX", oauth_token="XXXXXXXXXXXXXXXX", oauth_nonce="XXXXXXXXXXXXXXXX", oauth_timestamp="1300728665", oauth_signature_method="HMAC-SHA1", oauth_version="1.0", oauth_signature="XXXXXXXXXXXXXXXX%3D"' https://api.twitter.com/1/friends/ids.json?user_id=254723679

Стоит повторить это, как вы пытались сделать, вместо того, чтобы устанавливать заголовок авторизации, например, через. Функция beforeSend в jquery - для междоменных запросов JSONP (которые не могут добавлять заголовки HTTP) вы можете делать запросы oAuth, помещая все соответствующие пары ключ / значение в запрос GET. Надеемся, что это поможет другим людям, например,

  1. Установить заголовки с помощью jQuery.ajax и JSONP?
  2. Изменение заголовков HTTP для запроса JSONP
  3. Использование только JQuery для обновления Twitter (OAuth)

Ваш запрос выглядит так, как будто у него есть пара проблем; в нем отсутствует пользовательский oauth_token, а oauth_signature не выглядит так, как будто он был закодирован в base64 (потому что отсутствует шестнадцатеричный кодированный = или ==,% 3 или% 3D% 3D соответственно).

Вот мой эквивалент GET с использованием параметров строки запроса в кодировке oAuth, которые можно использовать в междоменном вызове JSONP:

https://api.twitter.com/1/friends/ids.json?user_id=254723679&realm=https://api.twitter.com/1/friends/ids.json&oauth_consumer_key=XXXXXXXXXXXXXXXX&oauth_token=XXXXXXXXXXXXXXXX&oauth_nonce=XXXXXXXXXXXXXXXX&oauth_timestamp=1300728665&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_signature=XXXXXXXXXXXXXXXX%3D
0 голосов
/ 30 января 2012

У меня была похожая проблема с выполнением запросов JSONP от Jquery, приведенный выше ответ помог мне просто добавить то, что я сделал для достижения своего решения.

Я выполняю oauth от сервера к серверу, а затем отправляю токен oauth, секрет, ключ потребителя и секрет (это временное решение, когда мы устанавливаем прокси-сервер для защиты секрета потребителя). Вы можете заменить его токеном, получающим код на клиенте.

Oauth.js и Sha1.js ссылка для скачивания ! После того, как подпись сгенерирована.

Сейчас есть 2 проблемы:

  1. Заголовок JSONP нельзя редактировать
  2. Подписанные аргументы, которые необходимо отправить как часть oauth, имеют проблему с callback =? (обычный способ использования JSONP).

Как сказано выше, ответ 1 не может быть сделан. Кроме того, обратный вызов =? не будет работать, так как список параметров должен быть подписан и при отправке запроса на удаленный сервер Jquery заменить callback =? к какому-то имени, как callback = Jquery1232453234. Поэтому должен использоваться именованный обработчик.

function my_twitter_resp_handler(data){
    console.log(JSON.stringify(data));
}

и getJSON не работали с обработчиком именованных функций, поэтому я использовал

var accessor = {
                   consumerSecret: XXXXXXXXXXXXXXXXXXXXXX,
                   tokenSecret   : XXXXXXXXXXXXXXXXXXXXXX

                 };

  var message = {  action: "https://api.twitter.com/1/statuses/home_timeline.json",
                   method: "GET",
                   parameters: []
                };
  message.parameters.push(['realm', "https://api.twitter.com/1/statuses/home_timeline.json"]);
  message.parameters.push(['oauth_version', '1.0']);
  message.parameters.push(['oauth_signature_method', 'HMAC-SHA1']);
  message.parameters.push(['oauth_consumer_key', XXXXXXXXXXXXXXXX]);
  message.parameters.push(['oauth_token', XXXXXXXXXXXXXXX]);
  message.parameters.push(['callback', 'my_twitter_resp_handler']);

  OAuth.completeRequest(message, accessor);

  var parameterMap = OAuth.getParameterMap(message.parameters);

Создание URL-адреса с базовыми парами URL-адресов и значений ключа из карты параметров

jQuery.ajax({ 
               url: url, 
               dataType: "jsonp",
               type: "GET",
              });
...