2010-08-09 15 views
7

¿Es posible utilizar OAuth con HTTParty? Intento hacer una llamada a la API this, pero, en contradicción con la documentación, necesita autenticación.OAuth y HTTParty

Antes de decir "Usar una gema específica de Twitter", escúchame - Lo he intentado. Probé con Twitter, Grackle e innumerables otros, pero ninguno admite esta API específica. Por lo tanto, he recurrido a HTTParty.

Entonces, ¿cómo podría usar OAuth con HTTParty?

+0

Usted podría bifurcar la gema de twitter y agregar el método que necesita (ver: http://github.com/jnunemaker/twitter/blob/master/lib/twitter/base.rb). De cualquier manera, la gema de Twitter puede ser un buen lugar para ver cómo se hace esto (ya que usa tanto HTTParty y OAuth) – Brian

+1

En realidad, parece que la gema de Twitter tiene la funcionalidad que está buscando, vea las líneas 33-35 en http://github.com/jnunemaker/twitter/blob/master/lib/twitter/base.rb – Brian

+0

Gracias. No me di cuenta de que antes>. < –

Respuesta

3

He estado usando la gema vainilla OAuth para implementar algunas simples llamadas a la API de Twitter. No necesitaba una gema de peso pesado para hacer todo, y ya estaba usando OAuth, por lo que un enfoque 'roll-your-own' me pareció razonable. Sé que no he mencionado HTTParty, así que por favor no me molestes por eso. Esto puede ser útil para otros por la esencia de Twitter OAuth fácil si ya estás usando la gema OAuth.

En caso de que sea útil, aquí está el código pertinente (lo de mezclar algunas constantes y otras variables/métodos al principio - que era la forma más fácil y más precisa para extraer esto desde mi código real):

#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 

Espero que esto, en gran parte en el contexto de un uso más amplio de la gema OAuth, pueda ser útil para otros.

+0

Gracias por la edición de Ismael Abreu. Capturando lo mal que extraje esto de otro código. – Phil

+0

Hola, sé que ha pasado un año, pero ¿puedes decirme dónde especifica '@ access_token'? Me encanta tu ejemplo y me dirijo a un problema contra el que me estoy golpeando en este momento. – BenMorganIO

+0

Ojalá pudiera ayudarte con eso. Mi código ha divergido tanto del original, ya que respondí que es difícil adivinar lo que estaba sucediendo. Pero fue el tercer paso en el intercambio entre su aplicación y Twitter, cuando intercambia el token de solicitud para el token de acceso. Quizás estos fragmentos ayuden: '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}, params) ' – Phil

0

que utiliza una mezcla de la gema OAuth2 para obtener el token de autenticación y HTTParty para hacer la consulta

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

No es perfecto por un largo camino, pero que parece haber hecho el truco hasta ahora