2011-01-20 7 views
6

Mam aplikację internetową dla iPhone'a, która ostatecznie będzie działać w aplikacji PhoneGap - ale na razie uruchamiam ją w Safari.Jak uzyskać dostęp do autorskich metod API Twitter z aplikacji internetowej

Aplikacja musi mieć dostęp do tweetów od znajomych z Twittera, w tym prywatnych tweetów. Dlatego zaimplementowałem OAuth przy użyciu biblioteki Scribe. Udostępniam użytkownikom konta na Twitterze, uwierzytelniam je, a następnie odbijam.

W tym momencie aplikacja internetowa ma poświadczenia OAuth (klucz i token), które utrzymuje się lokalnie. Odtąd chciałbym, aby użytkownik użył metody Twitter status/user_timeline.json do pobrania tweetów dla konkretnego użytkownika. Mam aplikację z żądaniami JSONP, aby to zrobić z niezabezpieczonymi tweetami; kiedy uzyskuje dostęp do osi czasu prywatnego kanału na Twitterze, w aplikacji pojawia się okno dialogowe uwierzytelniania podstawowego HTTP.

Uważam, że muszę podać dane uwierzytelniające OAuth na Twitterze, aby moja aplikacja internetowa mogła identyfikować się i uwierzytelniać. Twitter zaleca zrobienie tego poprzez dodanie nagłówka autoryzacji HTTP, ale ponieważ używam JSONP do żądania, nie sądzę, że jest to opcja dla mnie. Czy mam rację, zakładając to?

W związku z tym wydaje mi się, że moje opcje to podanie danych uwierzytelniających oAuth jako parametrów ciągów zapytania (które poleca na przykład Twitter, ale sugeruje to dokumentacja); lub proxy wszystkich tweetów przez serwer pośredniczący. Wolałbym uniknąć tego drugiego.

uzyskać dostęp do API Twittera za pomocą adresów URL formularza

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

Kiedy user_id jest użytkownik publiczny, to działa prawidłowo. Kiedy user_id jest użytkownikiem prywatnym, otrzymuję okno dialogowe HTTP Basic Auth. Masz pojęcie, co robię źle? Mam nadzieję, że to coś żenująco proste jak „zapominając ważny parametr” ...

Odpowiedz

4

OAuth strofa musi być dokładna, jak na http://dev.twitter.com/pages/auth#auth-request - skończyło się na budowaniu pozwolenia: nagłówek, że mogę najpierw sprawdzić z kędzior.

Zbudowałem go przy użyciu bardzo pomocny interaktywne żądania sprawdzania w http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iv-signing-requests/

Oto prośba przyjaciele API dla chronionego użytkownika:

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

Warto re-iteracji że próbowałem robić , zamiast ustawiać nagłówek Authorization przez np funkcja wcześniejszego wysyłania jquery, która dla żądań JSONP między domenami (które nie mogą dodawać nagłówków HTTP) można tworzyć żądania OAuth, umieszczając wszystkie odpowiednie pary klucz/wartość w żądaniu GET. To powinno pomóc nadzieją wiele innych pytań, np

  1. Set Headers with jQuery.ajax and JSONP?
  2. Modify HTTP Headers for a JSONP request
  3. Using only JQuery to update Twitter (OAuth)

Żądanie wygląda na to ma kilka problemów; brakuje oauth_token użytkownika plus oauth_signature nie wygląda na to, że został zakodowany base64 (ponieważ brakuje mu odpowiednio zakodowanego = lub ==,% 3 lub% 3D% 3D).

Oto mój GET równoważne użyciu OAuth zakodowane params ciągu kwerendy, które można wykorzystać w rozmowie JSONP cross-domain:

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

Very nice! Czy to ci się udało i czy nadal używasz tej metody? – Ivan

0

Miałem problemy z podobnym problemem składania wniosków jsonp z Jquery, powyższa odpowiedź pomogła aby dodać to, co zrobiłem, aby osiągnąć moje rozwiązanie.

Robię serwer do serwera oauth, a następnie wysyłam tokena Oautha, klucz tajny, klucz konsumencki i tajny (jest to rozwiązanie tymczasowe do momentu wprowadzenia proxy w celu ochrony tajemnicy klienta). Można go zastąpić tokenem pozyskiwania tokena na kliencie.

Oauth.js i Sha1.js download link! Po wygenerowaniu podpisu.

Teraz są 2 problemy:

  1. JSONP nagłówka nie może być edytowany
  2. Podpisane argumentów, które muszą być wysyłane jako część OAuth mieć problem z zwrotnego = (regularny sposób korzystania z JSONP).

Jak wyżej, odpowiedź 1 nie może być wykonana. Również callback =? nie zadziała, ponieważ lista parametrów musi zostać podpisana, a podczas wysyłania żądania do zdalnego serwera Jquery zastąpić callback =? do jakiejś nazwy, takiej jak callback = Jquery1232453234. Dlatego należy użyć nazwanego programu obsługi.

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

i getJSON nie działał z imieniem obsługi funkcji, więc użyłem

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); 

Tworzenie url url bazowej i par wartości klucza z parameterMap

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