2011-12-07 25 views
0

我正在嘗試編寫簡單的Ruby on Rails web應用程序,它通過oAuth登錄到Twitter並獲取用戶的關注者列表而不使用現有的oAuth庫。使用他們的指南https://dev.twitter.com/docs/auth/oauth,我已經設法使登錄工作正常,並因此有一個後續outh_token和oauth_token_secret。但是,當試圖爲登錄用戶的追隨者編碼GET請求時,我總是收到401「這種方法需要身份驗證。」在Ruby Twitter API中使用OAuth編碼GET

使用我的代碼及其示例數據,我可以看到我正確生成了oauth_signature。我可能會錯誤地生成signature_base_string,但在登錄時看到它可以正常工作,但我沒有看到它第二次出錯的方式。這些方法是類的一部分,所以消費者密鑰和祕密顯然是類變量。

相關代碼如下。這是'followees'中的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 

回答

1

想通了。需要休息一下才能退出!基本上,在追隨者的最後一行中不包括獲取數據,所以

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

應該已經

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

我已經複製張貼的代碼,因此剛使用url.path那裏。