【问题标题】:OAuth and HTTPartyOAuth 和 HTTParty
【发布时间】:2010-08-09 16:13:30
【问题描述】:

是否可以将 OAuth 与 HTTParty 一起使用?我正在尝试进行this API 调用,但是与文档相矛盾的是,它需要身份验证。

在你说“使用 Twitter 专用 Gem”之前,请听我说——我已经尝试过了。我试过 twitter、grackle 和无数其他的,但没有一个支持这个特定的 API 调用。所以,我转向了 HTTParty。

那么,如何将 OAuth 与 HTTParty 结合使用?

【问题讨论】:

标签: ruby oauth httparty


【解决方案1】:

我一直在使用 vanilla OAuth gem 来实现一些简单的 Twitter API 调用。我不需要重量级的 gem 来做所有事情,而且我已经在使用 OAuth,所以“自己动手”的方法似乎是合理的。我知道我没有提到 HTTParty,所​​以请不要为此而责备我。如果您已经在使用 OAuth gem,这对于其他人来说可能对轻松 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 gem 的背景下,可能对其他人有用。

【讨论】:

  • 感谢 Ismael Abreu 的编辑。发现我从其他代码中提取它有多糟糕。
  • 嘿,我知道已经一年了,但你能告诉我你在哪里指定@access_token吗?我很喜欢你的榜样,并针对我现在正在努力解决的问题。
  • 我希望我能帮助你。我的代码与原来的代码有很大的不同,因为我回答说很难预测发生了什么。但这是您的应用程序和 Twitter 之间交换的第三步,当您将请求令牌交换为访问令牌时。也许这些 sn-ps 有帮助: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)
【解决方案2】:

我不认为 HTTParty 支持 OAuth(虽然我不是 HTTParty 方面的专家,但对我来说它太高级而且速度太慢了)。

我会直接使用OAuth gem 调用 Twitter 请求。 Twitter API 文档甚至有一个使用示例:https://dev.twitter.com/docs/auth/oauth/single-user-with-examples#ruby

【讨论】:

    【解决方案3】:

    我混合使用了 OAuth2 gem 来获取身份验证令牌和 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})
    

    虽然还不是很完美,但到目前为止似乎已经成功了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多