2011-07-11 92 views
2

使用ruby OAuth庫,我試圖驗證以前用戶的憑據是否仍然有效。 (如果他已經撤銷了我的應用程序的特權),我已經做到了Twitter的沒有問題,因爲有一個方便的.authenticated?方法在Twitter OAuth庫中。儘管使用通用庫,但我找不到類似的方法。如何判斷Tumblr OAuth憑據是否有效?

@consumer = OAuth::Consumer.new(
     ENV['TUMBLR_CONSUMER_KEY'], 
     ENV['TUMBLR_CONSUMER_SECRET'], 
     { :site => 'http://www.tumblr.com', 
      :request_token_path => '/oauth/request_token', 
      :authorize_path => '/oauth/authorize', 
      :access_token_path => '/oauth/access_token', 
      :http_method => :get 
     } 
    ) 
     @access_token = OAuth::AccessToken.new(@consumer, @tumblrauth['access_token'], @tumblrauth['access_token_secret']) 
     puts @access_token.inspect 
     @resp = @access_token.get('api/read') 
     puts @resp.inspect 

我只要我嘗試@ access_token.get()調用,大約沒有一個downcase方法,我猜它期待某種形式的字符串,而不是nill的東西得到了一個服務器錯誤。但我不知道它指的是什麼參數。

我使用的access_token和祕密以前是功能性的,但我撤銷了對應用程序的訪問,以測試如何檢測該應用程序。我只需要一些方法來知道用戶不再註冊該服務,所以我可以切換狀態。

這裏是一個堆棧跟蹤:

NoMethodError - undefined method 'downcase' for nil:NilClass: /Library/Ruby/Gems/1.8/gems/oauth-0.4.4/lib/oauth/request_proxy/base.rb:93:in 'normalized_uri' /Library/Ruby/Gems/1.8/gems/oauth-0.4.4/lib/oauth/request_proxy/base.rb:113:in 'signature_base_string' /Library/Ruby/Gems/1.8/gems/oauth-0.4.4/lib/oauth/signature/base.rb:77:in 'signature_base_string'

回答

0

我可以在沒有用戶的Tumblr用戶名的情況下工作的唯一方法就是使用新的v2 API。文檔瀏覽:http://www.tumblr.com/docs/en/api/v2

@access_token.get('http://api.tumblr.com/v2/user/dashboard?limit=1') 

返回一個小信封JSON用200 OK或401未經授權如果令牌是壞的。

現在我必須弄清楚如何獲取用戶的博客名稱,因爲您似乎無法發佈到默認博客了。幸運的是,您可以同時使用v2和v1 API。

1

嘗試:

@resp = @access_token.get('http://www.tumblr.com/api/read/json') 

編輯,按照下面的評論:

#Monkey Patch the Oauth gem to fit the "tumblr" way of doing Oauth 
class Net::HTTP 
    def address=(new_address) 
    @address = new_address 
    end 
end 

module OAuth 
    class Consumer 

    def tumblr_address=(address) 
     @tumblr_address = address 
     @orig_address = self.http.address 
    end 

    def create_signed_request(http_method, path, token = nil, request_options = {}, *arguments) 
     # Use the original address to generate OAuth signature 
     self.http.address = @orig_address if @orig_address 

     request = create_http_request(http_method, path, *arguments) 
     sign!(request, token, request_options) 

     # Submit the request to the tumblr address 
     self.http.address = @tumblr_address if @tumblr_address 

     request 
    end 
    end 
end 

module OAuth 
    class RequestToken 
    def get_access_token(options = {}, *arguments) 
     response = consumer.token_request(consumer.http_method, (consumer.access_token_url? ? consumer.access_token_url : consumer.access_token_path), self, options, *arguments) 
     self.consumer.tumblr_address = response[:subdomain] 
     OAuth::AccessToken.from_hash(consumer, response) 
    end 
    end 
end 

,然後在你的控制器的後@消費者創造,添加此:

@consumer.tumblr_address = "http://user.tumblr.com" 

注意:這是未經測試的代碼,所以YMMV。

+0

這給出了一個404錯誤,因爲正確的路徑將是user.tumblr.com,因爲它是公開的,所以它沒有幫助。我需要一些調用,如果用戶已經撤銷了訪問權限,則會失敗,否則就會成功。 –

+0

它確實修復了Ruby錯誤,謝謝! –

+0

這很有道理。在紅寶石庫中,您使用「http://www.tumblr.com」進行簽名,但嘗試使用「http://user.tumblr.com」訪問資源。它違背了oauth規範,這就是爲什麼失敗。我已更新我的回覆以包含代碼。 – Cory

相關問題