2011-01-20 29 views
6

Tôi có một ứng dụng web cho iPhone, ứng dụng này cuối cùng sẽ chạy trong ứng dụng PhoneGap - nhưng hiện tại tôi đang chạy ứng dụng này trong Safari.Làm cách nào tôi có thể truy cập các phương pháp API Twitter chỉ từ một ứng dụng web

Ứng dụng cần truy cập tweet từ bạn bè trên Twitter, bao gồm cả các tweet riêng tư. Vì vậy, tôi đã triển khai OAuth bằng thư viện Scribe. Tôi đã thành công khi đưa người dùng lên Twitter, yêu cầu họ xác thực, sau đó trả lại.

Tại thời điểm này, ứng dụng web có thông tin đăng nhập oAuth (khóa và mã thông báo) mà nó vẫn tồn tại cục bộ. Từ đây tôi muốn nó sử dụng các phương thức của Twitter/user_timeline.json để lấy các tweet cho một người dùng cụ thể. Tôi có ứng dụng sử dụng các yêu cầu JSONP để thực hiện điều này với các tweet không được bảo vệ thành công; khi nó truy cập vào dòng thời gian của một nguồn cấp dữ liệu Twitter riêng tư, một hộp thoại xác thực cơ bản HTTP xuất hiện trong ứng dụng.

Tôi tin rằng tôi cần cung cấp thông tin đăng nhập OAuth cho Twitter để ứng dụng web của tôi có thể xác định và xác thực chính nó. Twitter khuyên bạn nên làm như vậy thông qua việc bổ sung một tiêu đề HTTP Authorization, nhưng khi tôi đang sử dụng JSONP cho yêu cầu, tôi không nghĩ rằng đây là một lựa chọn cho tôi. Tôi có giả định điều này không?

Do đó, các tùy chọn của tôi có vẻ như đang đặt thông tin xác thực oAuth dưới dạng thông số chuỗi truy vấn (mà Twitter đề xuất chống lại, nhưng tài liệu gợi ý vẫn hỗ trợ); hoặc ủy quyền tất cả các Tweet thông qua một máy chủ trung gian. Tôi muốn tránh cái sau.

tôi truy cập API Twitter sử dụng URL có dạng

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

Khi user_id là một người sử dụng công cộng, điều này hoạt động tốt. Khi user_id là một người dùng riêng, tôi nhận được hộp thoại Xác thực cơ bản HTTP đó. Bất kỳ ý tưởng những gì tôi đang làm sai? Tôi hy vọng đó là điều đơn giản đáng xấu hổ như "quên một tham số quan trọng" ...

Trả lời

4

Thông báo oAuth cần chính xác, theo số http://dev.twitter.com/pages/auth#auth-request - Tôi đã kết thúc việc tạo một tiêu đề Cấp phép: curl.

tôi xây dựng nó bằng cách sử dụng kiểm tra yêu cầu tương tác thực sự hữu ích tại http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iv-signing-requests/

Dưới đây là một yêu cầu bạn bè API cho một người sử dụng được bảo vệ:

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

Nó có giá trị tái lặp lại rằng khi bạn đã cố gắng để làm , thay vì đặt tiêu đề Cấp quyền qua ví dụ Hàm beforeSend của jquery, đối với các yêu cầu JSONP nhiều miền (không thể thêm các tiêu đề HTTP), bạn có thể thực hiện các yêu cầu oAuth bằng cách đặt tất cả các cặp khóa/giá trị có liên quan trong yêu cầu GET. Đây hy vọng sẽ giúp đỡ người đặt câu hỏi khác nhau, ví dụ

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

Yêu cầu của bạn trông giống như nó có một vài vấn đề; thiếu oauth_token của người dùng cộng với oauth_signature không giống như nó đã được mã hóa base64 (vì nó thiếu một mã hóa hex = hoặc ==,% 3 hoặc% 3D% 3D tương ứng).

Dưới đây là GET tương đương của tôi sử dụng params querystring OAuth mã hóa, mà bạn có thể sử dụng trong một cuộc gọi 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! Điều này làm việc tốt cho bạn và bạn vẫn đang sử dụng phương pháp này? – Ivan

0

tôi đã phải vật lộn với vấn đề tương tự làm cho yêu cầu JSONP từ Jquery, câu trả lời ở trên giúp chỉ để thêm những gì tôi đã làm để đạt được giải pháp của tôi.

Tôi đang làm máy chủ với oauth máy chủ và sau đó tôi gửi mã thông báo oauth, bí mật, khóa người dùng và bí mật (đây là giải pháp tạm thời khi chúng tôi đặt proxy để bảo vệ bí mật người tiêu dùng). Bạn có thể thay thế mã này để lấy mã thông báo tại khách hàng.

Oauth.js và Sha1.js download link! Khi chữ ký được tạo.

Bây giờ có 2 vấn đề:

  1. JSONP tiêu đề không thể chỉnh sửa
  2. luận Signed mà cần phải được gửi dưới dạng một phần của oauth có vấn đề với callback =? (một cách thường xuyên sử dụng JSONP).

Như câu trả lời ở trên, 1 không thể thực hiện được. Ngoài ra, gọi lại =? sẽ không hoạt động như danh sách tham số đã được ký và trong khi gửi yêu cầu đến máy chủ từ xa Jquery thay thế gọi lại =? với một số tên như callback = Jquery1232453234. Vì vậy, một xử lý được đặt tên đã được sử dụng.

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

và getJSON đã không làm việc với xử lý hàm có tên, vì vậy tôi sử dụng

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

Tạo url với địa chỉ cơ sở và các cặp giá trị quan trọng từ parameterMap

jQuery.ajax({ 
       url: url, 
       dataType: "jsonp", 
       type: "GET", 
       }); 
Các vấn đề liên quan