2010-08-09 27 views
7

Có thể sử dụng OAuth với HTTParty không? Tôi đang cố gắng thực hiện cuộc gọi API this, nhưng, trái ngược với tài liệu, nó cần xác thực.OAuth và HTTParty

Trước khi bạn nói "Sử dụng đá quý Twitter cụ thể", hãy nghe tôi - Tôi đã thử. Tôi đã thử twitter, grackle, và vô số người khác, nhưng không ai hỗ trợ cuộc gọi API cụ thể này. Vì vậy, tôi đã chuyển sang HTTParty.

Vì vậy, làm cách nào tôi có thể sử dụng OAuth với HTTParty?

+0

Bạn có thể ngã ba đá quý twitter và thêm phương pháp bạn cần (xem: http://github.com/jnunemaker/twitter/blob/master/lib/twitter/base.rb). Dù bằng cách nào, đá quý Twitter có thể là một nơi tốt để xem cách thực hiện điều này (vì nó sử dụng cả HTTParty & OAuth) – Brian

+1

Thực ra, Dường như đá quý Twitter có chức năng bạn đang tìm kiếm, xem các dòng 33-35 trong http://github.com/jnunemaker/twitter/blob/master/lib/twitter/base.rb – Brian

+0

Cảm ơn. Không nhận thấy rằng trước đó>. < –

Trả lời

1

Tôi không nghĩ rằng HTTParty hỗ trợ OAuth (mặc dù tôi không có chuyên gia về HTTParty, nó quá cao cấp và chậm đối với sở thích của tôi).

Tôi sẽ chỉ gọi yêu cầu Twitter trực tiếp bằng cách sử dụng OAuth gem. Tài liệu Twitter API thậm chí có một ví dụ về cách sử dụng: https://dev.twitter.com/docs/auth/oauth/single-user-with-examples#ruby

3

Tôi đã sử dụng đá quý vanilla OAuth để thực hiện một vài cuộc gọi API Twitter đơn giản. Tôi không cần một viên đá quý nặng để làm mọi thứ, và tôi đã sử dụng OAuth, vì vậy cách tiếp cận 'cuộn của riêng bạn' có vẻ hợp lý. Tôi biết rằng tôi đã không đề cập đến HTTParty, vì vậy xin vui lòng không ding tôi cho điều đó. Điều này có thể hữu ích cho người khác vì bản chất của Twitter OAuth dễ dàng nếu bạn đã sử dụng đá quý OAuth.

Trong trường hợp nó là hữu ích, đây là mã thích hợp (xin lỗi về pha trộn một số hằng số và các biến khác/phương pháp ngay từ đầu - đó là cách dễ nhất và chính xác nhất để trích xuất này từ mã thật của tôi):

#Set up the constants, etc required for Twitter OAuth 
OAUTH_SITE = "https://api.twitter.com" 
TOKEN_REQUEST_METHOD = :post 
AUTHORIZATION_SCHEME = :header 

    def app_request_token_path 
    "/oauth/request_token" 
    end  
    def app_authorize_path 
    "/oauth/authorize" 
    end  
    def app_access_token_path   
    "/oauth/access_token"   
    end 
    def consumer_key 
    "your twitter API key" 
    end 
    def consumer_secret 
    "your twitter API secret" 
    end 

    # Define the OAuth consumer 
    def consumer meth=:post 
    @consumer ||= OAuth::Consumer.new(consumer_key,consumer_secret, { 
     :site => "#{OAUTH_SITE}", 
     :request_token_path=>app_request_token_path, 
     :authorize_path=>app_authorize_path, 
     :access_token_path=>app_access_token_path, 
     :http_method=>:post, 
     :scheme=> :header, 
     :body_hash => '' 
    }) 
    end    

    # Essential parts of a generic OAuth request method 
    def make_request url, method=:get, headers={}, content=''     
    if method==:get 
     res = @access_token.get(url, headers) 
    elsif method==:post 
     res = @access_token.post(url, content, headers) 
    end 

    if res.code.to_s=='200' 
     jres = ActiveSupport::JSON.decode(res.body) 
     if jres.nil? 
     @last_status_text = @prev_error = "Unexpected error making an OAuth API call - response body is #{res.body}" 
     end  
     return jres 
    else 
     @last_status_text = @prev_error = res if res.code.to_s!='200' 
     return nil  
    end 
    end 

# Demonstrate the daily trends API call 
# Note the use of memcache to ensure we don't break the rate-limiter 
    def daily_trends 

    url = "http://api.twitter.com/1/trends/daily.json"  
    @last_status_code = -1 
    @last_status_success = false 
    res = Rails.cache.fetch(url, :expires_in=> 5.minutes) do 
     res = make_request(url, :get)   
     unless res 
     @last_status_code = @prev_error.code.to_i 
     end 
     res 
    end     
    if res 
     @last_status_code = 200 
     @last_status_success = true 
     @last_status_text = "" 
    end 
    return res 
    end 

Tôi hy vọng điều này, chủ yếu trong ngữ cảnh sử dụng rộng hơn đá quý OAuth, có thể hữu ích cho người khác.

+0

Cảm ơn bạn đã chỉnh sửa Ismael Abreu. Bắt được cách tôi trích xuất kém này từ mã khác. – Phil

+0

Xin chào, tôi biết đã một năm rồi, nhưng bạn có thể cho tôi biết nơi bạn chỉ định '@ access_token' không? Tôi yêu thích ví dụ của bạn và nhắm mục tiêu một vấn đề tôi đang đánh đầu của tôi chống lại ngay bây giờ. – BenMorganIO

+0

Tôi ước tôi có thể giúp bạn với điều đó. Mã của tôi đã phân kỳ rất nhiều so với bản gốc kể từ khi tôi trả lời rằng thật khó để đoán được những gì đang diễn ra. Nhưng đó là bước thứ ba trong trao đổi giữa ứng dụng của bạn và Twitter, khi bạn trao đổi mã thông báo yêu cầu cho mã thông báo truy cập. Có lẽ các đoạn mã này giúp: 'request_token = params [: oauth_token]; oauth_options = {: oauth_verifier => params [: oauth_verifier]}; OAuth :: RequestToken.new (consumer, request_token, consumer_secret); @access_token = request_token.get_access_token ({: http_method => TOKEN_REQUEST_METHOD}, thông số) ' – Phil

0

tôi đã sử dụng một hỗn hợp của đá quý OAuth2 để có được xác thực token và HTTParty để làm cho truy vấn

client = OAuth2::Client.new(apiKey, apiSecret, 
          :site => "https://SiteForAuthentication.com") 
oauthResponse = client.password.get_token(username, password) 
token = oauthResponse.token 

queryAnswer = HTTParty.get('https://api.website.com/query/location', 
          :query => {"token" => token}) 

Không hoàn hảo bởi một chặng đường dài nhưng có vẻ như đã làm các trick cho đến nay

Các vấn đề liên quan