OAuth и HTTParty - PullRequest
       6

OAuth и HTTParty

8 голосов
/ 09 августа 2010

Можно ли использовать OAuth с HTTParty?Я пытаюсь сделать этот вызов API, но, в отличие от документации, он требует аутентификации.

Прежде чем вы скажете "Использовать камень, специфичный для Twitter", выслушайте меня ...Я пробовал.Я пробовал твиттер, grackle и многие другие, но никто не поддерживает этот конкретный вызов API.Итак, я обратился к HTTParty.

Итак, как я могу использовать OAuth с HTTParty?

Ответы [ 3 ]

3 голосов
/ 28 июля 2012

Я использовал ванильный гем OAuth для реализации нескольких простых вызовов API Twitter. Мне не нужен был тяжеловесный драгоценный камень, чтобы делать все, и я уже использовал OAuth, поэтому подход «бросай свой собственный» казался разумным. Я знаю, что не упомянул HTTParty, поэтому, пожалуйста, не связывайтесь со мной. Это может быть полезно для других по сути простого OAuth в Twitter, если вы уже используете гем OAuth.

В случае, если это полезно, вот соответствующий код (извините за смешивание некоторых констант и других переменных / методов в начале - это был самый простой и точный способ извлечь это из моего реального кода):

#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  

Я надеюсь, что это, в основном в контексте более широкого использования драгоценного камня OAuth, может быть полезным для других.

1 голос
/ 18 июня 2012

Я не думаю, что HTTParty поддерживает OAuth (хотя я не эксперт по HTTParty, он слишком высокоуровневый и медленный на мой вкус).

Я бы просто вызвал запрос Twitter, используя OAuth gem .В документации по API Twitter даже есть пример использования: https://dev.twitter.com/docs/auth/oauth/single-user-with-examples#ruby

0 голосов
/ 05 октября 2015

Я использовал сочетание гема OAuth2 для получения токена аутентификации и HTTParty для выполнения запроса

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

Долгий путь не идеален, но, похоже, до сих пор добился цели

...