2012-02-05 10 views
7

私は、自分のapiの2-Legged OAuthプロバイダを構築しています。すべてが適切に接続されており、レールコンソールからの署名付き通話が可能です。私が持っている問題は、OAuthをcontroller_specに統合する際に問題があることです。ここでSigned OAuthリクエストを使用するようコントローラ仕様に指示する方法

は私のサーバー上の作業コールの例です:

coneybeare $ rails c test 
Loading test environment (Rails 3.2.0) 
rails test: main 
>> consumer = OAuth::Consumer.new("one_key", "MyString", :site => [REDACTED]) 
# => #<OAuth::Consumer:0x007f9d01252268 @key="one_key", @secret="MyString", @options={:signature_method=>"HMAC-SHA1", :request_token_path=>"/oauth/request_token", :authorize_path=>"/oauth/authorize", :access_token_path=>"/oauth/access_token", :proxy=>nil, :scheme=>:header, :http_method=>:post, :oauth_version=>"1.0", :site=>[REDACTED]}> 

ruby: main 
>> req = consumer.create_signed_request(:get, "/api/v1/client_applications.json", nil) 
# => #<Net::HTTP::Get GET> 

ruby: main 
>> res = Net::HTTP.start([REDACTED]) {|http| http.request(req) } 
# => #<Net::HTTPOK 200 OK readbody=true> 

ruby: main 
>> puts res.body 
{"client_applications":[{"id":119059960,"name":"FooBar1","url":"http://test1.com"},{"id":504489040,"name":"FooBar2","url":"http://test2.com"}]} 
# => nil 

そして、ここでは、私は私のコントローラのテストでやっているものです:

require 'oauth/client/action_controller_request' 
describe Api::ClientApplicationsController do 
    include OAuthControllerSpecHelper 
    … 
    … 
    it "assigns all client_applications as @client_applications" do 
     consumer = OAuth::Consumer.new("one_key", "MyString", :site => [REDACTED]) 
     ActionController::TestRequest.use_oauth=true 
     @request.configure_oauth(consumer) 
     @request.apply_oauth! 
     puts "request.env['Authorization'] = #{@request.env['Authorization']}" 
     get :index, {:api_version => 'v1', :format => :json} 
     response.should be_success # Just this for now until I can get authorization, then proper controller testing 
    end 
end 

そのテストの出力:

request.env['Authorization'] = OAuth oauth_consumer_key="one_key", oauth_nonce="gzAbvBSWyFtIYKfuokMAdu6VnH39EHeXvebbH2qUtE", oauth_signature="juBkJo5K0WLu9mYqHVC3Ar%2FATUs%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1328474800", oauth_version="1.0" 
1) Api::ClientApplicationsController GET index assigns all client_applications as @client_applications 
    Failure/Error: response.should be_success 
    expected success? to return true, got false 

レールからの対応するサーバーコールログ:

Processing by Api::ClientApplicationsController#index as JSON 
    Parameters: {"api_version"=>1} 
    Rendered text template (0.0ms) 
Filter chain halted as #<OAuth::Controllers::ApplicationControllerMethods::Filter:0x007f85a51a8858 @options={:interactive=>false, :strategies=>:two_legged}, @strategies=[:two_legged]> rendered or redirected 
Completed 401 Unauthorized in 15ms (Views: 14.1ms | ActiveRecord: 0.0ms) 
    (0.2ms) ROLLBACK 

なぜ機能していないのか分かりません:/明白な間違いをしていますか?

+0

が聞こえます仕様。リクエスト仕様として試しましたか? – apneadiving

+0

コントローラ仕様です。この例は、裸の必需品に取り除かれました。あなたが正しい場合、このタイプのテストはリクエスト仕様に入るはずです.OAuthによって保護されている場合、私のコントローラをテストするはずです。 – coneybeare

+0

私は最近、APIをテストしています。コントローラの仕様では、ヘッダーに適切な値を渡すだけです。申し訳ありませんが、私はOAuthについて本当に知っていません。私があなたのケースで恐れるのは、 'create_signed_request'は期待される結果を得られないということです。あなたはそれをデバッグしようとしましたか?ちょっと考えてみましょう:テスト中にいくつかの 'before_filters'をバイパスすることができます – apneadiving

答えて

0

私のコントローラをテストする最良の方法が最も簡単だったことがわかりました。コントローラが適切な情報(実際にコントローラの仕様ではない要求仕様に属しているもの)を得るように各テストに署名する代わりに、コントローラに手動で必要な情報を与えることができるとわかりました。

これを行うために、私は単純に2つの方法をスタブにしていた:allow?メソッドをスタブ

fixtures :client_applications 
before(:each) do 
    @client_application1 = client_applications(:client_application1) 
    Api::ClientApplicationsController::Authenticator.any_instance.stub(:allow?).and_return(true) 
    controller.stub(:client_application).and_return(@client_application1) 
end 

ラック認証は、それが認証された考えにだまされる原因となりました。 allow?でも、資格情報に基づいてclient_applicationを設定しました。そのため、私もスタブする必要がありました。 authが途切れたので、コントローラを正しくテストできます。あなたは、要求仕様にそれをテストしたいと実際にスタブなしでテストする必要があるだろう場合は、OAuthのコンシューマを構築し、このような要求に署名することができます

0

Omniauthのテストヘルパーがどのように機能するか、具体的にはこれらのファイルは、https://github.com/intridea/omniauth/tree/master/lib/omniauth/testです。これがどのように設定されているかについては、wiki page on integration testingをご覧ください。私はあなたがクライアントではなくプロバイダーをつくっていることを認識していますが、これは良い出発点かもしれません。コメント者の中には既に言っているように、コントローラテストでこれを行うことができるかどうかはわかりません。ラック環境を完全にシミュレートするには、要求または統合テストが必要な場合があります。

1

:それは本当にコントローラではありませんように

@access_token = FactoryGirl.create :access_token 
    @consumer = OAuth::Consumer.new(@access_token.app.key, @access_token.app.secret, :site => "http://www.example.com/") 
    @path = "/path/to/request" 
    @request = @consumer.create_signed_request(:get, @path, OAuth::AccessToken.new(@consumer, @access_token.token, @access_token.secret)) 
    get @path, nil, { 'HTTP_AUTHORIZATION' => @request.get_fields('authorization').first } 
関連する問題