簡體   English   中英

在Ruby Twitter API中使用OAuth編碼GET

[英]Encoding a GET using OAuth in Ruby Twitter API

我正在嘗試編寫簡單的Ruby on Rails Web應用程序,該應用程序通過oAuth登錄到Twitter並獲取用戶的關注者列表, 而無需使用現有的oAuth庫 使用位於https://dev.twitter.com/docs/auth/oauth的指南,我設法使登錄正常工作,因此有了后續的outh_token和oauth_token_secret。 但是,當嘗試對已登錄用戶的關注者的GET請求進行編碼時,我總是收到401“此方法需要身份驗證”。

使用我的代碼及其示例數據,可以看到我正在正確生成oauth_signature。 我可能生成了不正確的signature_base_string,但是看到它在登錄時可以正常工作,所以我看不到第二次怎么可能出錯。 這些方法是類的一部分,因此使用者密鑰和機密顯然是類變量。

相關代碼如下。 這是“追隨者”中HTTP GET的輸出,給出了401。我希望這很荒謬,因為我錯過了這么久才發現! 我知道我有正確的值作為參數傳遞給函數。 謝謝。

  def followees(auth_token, auth_token_secret, user_id)
    method = 'GET'
    base_uri = 'https://api.twitter.com/1/friends/ids.json'
    params = {
      'cursor' => '-1',
      'oauth_consumer_key' => @@consumer_key,
      'oauth_nonce' => generate_nonce, #not shown, no need!
      'oauth_signature_method' => 'HMAC-SHA1',
      'oauth_token' => auth_token,
      'oauth_timestamp' => Time.now.to_i.to_s,
      'oauth_version' => '1.0',
      'user_id' => user_id
    }
    signature_base_string = signature_base_string(method, base_uri, params)
    params['oauth_signature'] = url_encode(sign(@@consumer_secret + '&' + auth_token_secret, signature_base_string))
    header = header(params)
    base_uri += '?cursor=-1&user_id=' + user_id
    url = URI.parse(base_uri)
    http = Net::HTTP.new(url.host, 443)
    http.use_ssl = true
    resp, data = http.get(url.path, { 'Authorization' => header })
  end

  def signature_base_string(method, uri, params)
    encoded_params = params.sort.collect{ |k, v| url_encode("#{k}=#{v}") }.join("%26")
    method + '&' + url_encode(uri) + '&' + encoded_params
  end

  def url_encode(string)
    CGI::escape(string)
  end

  def sign(key, base_string)
    digest = OpenSSL::Digest::Digest.new('sha1')
    hmac = OpenSSL::HMAC.digest(digest, key, base_string)
    Base64.encode64(hmac).chomp.gsub(/\n/, '')
  end

  def header(params)
    header = "OAuth "
    params.each do |k, v|
      header += "#{k}=\"#{v}\", "
    end
    header.slice(0..-3)
  end

弄清楚了。 需要休息一下才能退后! 基本上,追隨者的最后一行不包含GET數據,因此

resp, data = http.get(url.path, { 'Authorization' => header })

應該是

resp, data = http.get(url.to_s, { 'Authorization' => header })

我已經復制了用於發布的代碼,因此在那里只使用了url.path。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM