2011-07-25 38 views
2

我在Rails功能測試中使用OAuth簽名的請求時遇到了一個問題。Rails功能測試和OAuth參數問題

我很感激幫助,或指向工作示例。

我正嘗試使用在oauth gem(0.4.5)中構建的ActionController :: TestRequest覆蓋。

我已經試過這個解決方案沒有效果:http://d.hatena.ne.jp/falkenhagen/20091110/1257830144

這是我現在在做什麼?

require 'oauth/client/action_controller_request' 

我創建了一個方法,這樣做登錄到我可以傳遞一個OauthConsumer對象(ActiveRecord)和我的URL參數(用於查詢字符串)。

def _do_oauth(consumer, params = {}) 
    c=OAuth::Consumer.new(consumer.consumer_key, consumer.consumer_secret) 
    t=OAuth::AccessToken.new(c) 
    ActionController::TestRequest.use_oauth=true 
    @request.configure_oauth(c, t, params) 
end 

,並在我的測試情況下調用它像這樣:

params = { :store => 'foo' } 
_do_oauth(oauth_consumers(:one), params) # currently not working for passing params 
get :index, { :format => :json }.merge(params) 

但它看起來並不像請求是拿起「PARAMS」或正確編碼它們。

我得到的(這發生在「獲取」線以上)的錯誤:

ArgumentError: comparison of Array with Array failed 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/oauth-0.4.5/lib/oauth/helper.rb:37:in `sort' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/oauth-0.4.5/lib/oauth/helper.rb:37:in `normalize' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/oauth-0.4.5/lib/oauth/request_proxy/base.rb:98:in `normalized_parameters' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/oauth-0.4.5/lib/oauth/request_proxy/base.rb:113:in `signature_base_string' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/oauth-0.4.5/lib/oauth/signature/base.rb:77:in `signature_base_string' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/oauth-0.4.5/lib/oauth/signature/hmac/base.rb:12:in `digest' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/oauth-0.4.5/lib/oauth/signature/base.rb:65:in `signature' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/oauth-0.4.5/lib/oauth/signature.rb:23:in `sign' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/oauth-0.4.5/lib/oauth/client/helper.rb:45:in `signature' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/oauth-0.4.5/lib/oauth/client/helper.rb:75:in `header' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/oauth-0.4.5/lib/oauth/client/action_controller_request.rb:54:in `set_oauth_header' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/oauth-0.4.5/lib/oauth/client/action_controller_request.rb:50:in `apply_oauth!' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/oauth-0.4.5/lib/oauth/client/action_controller_request.rb:14:in `process_with_new_base_test' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/actionpack-3.0.7/lib/action_controller/test_case.rb:412:in `process' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/actionpack-3.0.7/lib/action_controller/test_case.rb:47:in `process' 
/home/sp/.rvm/gems/ruby-1.9.2-p180/gems/actionpack-3.0.7/lib/action_controller/test_case.rb:350:in `get' 
test/functional/deals_controller_test.rb:56:in `block in <class:DealsControllerTest>' 

我假設它的東西做的查詢參數不正確編碼,或頭沒有正確格式化。任何幫助(甚至指向可行的示例)都將不勝感激。

我還應該指出,我試圖測試的應用程序是一個雙腿OAuth提供程序。所以,應用程序只是解析簽名並檢查消費者密鑰/祕密簽出。

+0

當params的順序不正確時,我遇到了問題。也許可以幫助。不知道。 – lzap

+0

是的,我相信可能是這樣。我很喜歡看到一個「正確」的方法來做到這一點。 – stuffinq2010

+0

你有沒有得到你的規格工作在2腿oauthenticated控制器? – coneybeare

回答

4

這可能不會對最初的問題有幫助,但它可能會節省幾分鐘。

問題是如果一個散列有符號和字符串鍵的混合,那麼散列上的排序方法就會嚇倒。 Oauth在字符串哈希中添加了一些由字符串鍵入的條目。