rack-oauth2 0.7.0 → 0.8.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,31 +1,28 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rack-oauth2 (0.6.9)
4
+ rack-oauth2 (0.8.0.alpha)
5
5
  activesupport (>= 2.3)
6
6
  attr_required (>= 0.0.3)
7
+ httpclient (>= 2.2.0.2)
7
8
  i18n
8
9
  json (>= 1.4.3)
9
10
  rack (>= 1.1)
10
- restclient_with_cert
11
11
 
12
12
  GEM
13
13
  remote: http://rubygems.org/
14
14
  specs:
15
15
  activesupport (3.0.7)
16
+ addressable (2.2.6)
16
17
  attr_required (0.0.3)
18
+ crack (0.1.8)
17
19
  diff-lcs (1.1.2)
18
- fakeweb (1.3.0)
20
+ httpclient (2.2.0.2)
19
21
  i18n (0.5.0)
20
22
  json (1.5.1)
21
- mime-types (1.16)
22
23
  rack (1.2.2)
23
24
  rake (0.8.7)
24
25
  rcov (0.9.9)
25
- rest-client (1.6.1)
26
- mime-types (>= 1.16)
27
- restclient_with_cert (0.0.7)
28
- rest-client (>= 1.6)
29
26
  rspec (2.5.0)
30
27
  rspec-core (~> 2.5.0)
31
28
  rspec-expectations (~> 2.5.0)
@@ -34,13 +31,16 @@ GEM
34
31
  rspec-expectations (2.5.0)
35
32
  diff-lcs (~> 1.1.2)
36
33
  rspec-mocks (2.5.0)
34
+ webmock (1.6.4)
35
+ addressable (> 2.2.5, ~> 2.2)
36
+ crack (>= 0.1.7)
37
37
 
38
38
  PLATFORMS
39
39
  ruby
40
40
 
41
41
  DEPENDENCIES
42
- fakeweb (>= 1.3)
43
42
  rack-oauth2!
44
43
  rake (>= 0.8)
45
44
  rcov (>= 0.9)
46
45
  rspec (<= 2.5, >= 2)
46
+ webmock (>= 1.6.2)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.8.0.alpha
data/lib/rack/oauth2.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'rack'
2
2
  require 'json'
3
- require 'restclient_with_cert'
3
+ require 'httpclient'
4
4
  require 'active_support/core_ext'
5
5
  require 'attr_required'
6
6
  require 'attr_optional'
@@ -2,14 +2,17 @@ module Rack
2
2
  module OAuth2
3
3
  class AccessToken
4
4
  include AttrRequired, AttrOptional
5
- attr_required :access_token, :token_type
5
+ attr_required :access_token, :token_type, :client
6
6
  attr_optional :refresh_token, :expires_in, :scope
7
+ delegate :get, :post, :put, :delete, :to => :client
7
8
 
8
9
  def initialize(attributes = {})
9
10
  (required_attributes + optional_attributes).each do |key|
10
11
  self.send :"#{key}=", attributes[key]
11
12
  end
12
13
  @token_type = self.class.to_s.split('::').last.underscore.to_sym
14
+ @client = HTTPClient.new
15
+ @client.request_filter << Authenticator.new(self)
13
16
  attr_missing!
14
17
  end
15
18
 
@@ -22,26 +25,11 @@ module Rack
22
25
  :scope => Array(scope).join(' ')
23
26
  }
24
27
  end
25
-
26
- def get(url, headers = {}, &block)
27
- RestClient.get url, authenticate(headers), &block
28
- end
29
-
30
- def post(url, payload, headers = {}, &block)
31
- RestClient.post url, payload, authenticate(headers), &block
32
- end
33
-
34
- def put(url, payload, headers = {}, &block)
35
- RestClient.put url, payload, authenticate(headers), &block
36
- end
37
-
38
- def delete(url, headers = {}, &block)
39
- RestClient.delete url, authenticate(headers), &block
40
- end
41
28
  end
42
29
  end
43
30
  end
44
31
 
32
+ require 'rack/oauth2/access_token/authenticator'
45
33
  require 'rack/oauth2/access_token/bearer'
46
34
  require 'rack/oauth2/access_token/mac'
47
35
  require 'rack/oauth2/access_token/legacy'
@@ -0,0 +1,24 @@
1
+ module Rack
2
+ module OAuth2
3
+ class AccessToken
4
+ class Authenticator
5
+ def initialize(token)
6
+ @token = token
7
+ end
8
+
9
+ # Callback called in HTTPClient (before sending a request)
10
+ # request:: HTTP::Message
11
+ def filter_request(request)
12
+ @token.authenticate(request)
13
+ end
14
+
15
+ # Callback called in HTTPClient (after received a response)
16
+ # response:: HTTP::Message
17
+ # request:: HTTP::Message
18
+ def filter_response(response, request)
19
+ # nothing to do
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -2,9 +2,8 @@ module Rack
2
2
  module OAuth2
3
3
  class AccessToken
4
4
  class Bearer < AccessToken
5
- private
6
- def authenticate(headers)
7
- headers.merge(:AUTHORIZATION => "Bearer #{access_token}")
5
+ def authenticate(request)
6
+ request.header["Authorization"] = "Bearer #{access_token}"
8
7
  end
9
8
  end
10
9
  end
@@ -11,9 +11,8 @@ module Rack
11
11
  self.access_token
12
12
  end
13
13
 
14
- private
15
- def authenticate(headers)
16
- headers.merge(:AUTHORIZATION => "OAuth2 #{access_token}")
14
+ def authenticate(request)
15
+ request.header["Authorization"] = "OAuth2 #{access_token}"
17
16
  end
18
17
  end
19
18
  end
@@ -20,13 +20,12 @@ module Rack
20
20
 
21
21
  def verify!(request)
22
22
  if request.body_hash.present?
23
- _body_hash_ = BodyHash.new(
23
+ BodyHash.new(
24
24
  :raw_body => request.body.read,
25
25
  :algorithm => self.mac_algorithm
26
- )
27
- _body_hash_.verify!(request.body_hash)
26
+ ).verify!(request.body_hash)
28
27
  end
29
- _signature_ = Signature.new(
28
+ Signature.new(
30
29
  :secret => self.mac_key,
31
30
  :algorithm => self.mac_algorithm,
32
31
  :nonce => request.nonce,
@@ -36,60 +35,35 @@ module Rack
36
35
  :port => request.port,
37
36
  :body_hash => request.body_hash,
38
37
  :ext => request.ext
39
- )
40
- _signature_.verify!(request.signature)
38
+ ).verify!(request.signature)
41
39
  rescue Verifier::VerificationFailed => e
42
40
  request.invalid_token! e.message
43
41
  end
44
42
 
45
- def get(url, headers = {}, &block)
46
- _headers_ = authenticate(:get, url, headers)
47
- RestClient.get url, _headers_, &block
48
- end
49
-
50
- def post(url, payload, headers = {}, &block)
51
- _headers_ = authenticate(:post, url, headers, payload)
52
- RestClient.post url, payload, _headers_, &block
53
- end
54
-
55
- def put(url, payload, headers = {}, &block)
56
- _headers_ = authenticate(:put, url, headers, payload)
57
- RestClient.put url, payload, _headers_, &block
58
- end
59
-
60
- def delete(url, headers = {}, &block)
61
- _headers_ = authenticate(:delete, url, headers)
62
- RestClient.delete url, _headers_, &block
63
- end
64
-
65
- private
66
-
67
- def authenticate(method, url, headers = {}, payload = {})
68
- _url_ = URI.parse(url)
43
+ def authenticate(request)
69
44
  @nonce = generate_nonce
70
- if payload.present?
71
- raw_body = RestClient::Payload.generate(payload).to_s
72
- _body_hash_ = BodyHash.new(
73
- :raw_body => raw_body,
45
+ if request.contenttype == 'application/x-www-form-urlencoded'
46
+ @body_hash = BodyHash.new(
47
+ :raw_body => request.body,
74
48
  :algorithm => self.mac_algorithm
75
- )
76
- @body_hash = _body_hash_.calculate
49
+ ).calculate
77
50
  end
78
- _signature_ = Signature.new(
51
+ @signature = Signature.new(
79
52
  :secret => self.mac_key,
80
53
  :algorithm => self.mac_algorithm,
81
54
  :nonce => self.nonce,
82
- :method => method,
83
- :request_uri => _url_.request_uri,
84
- :host => _url_.host,
85
- :port => _url_.port,
55
+ :method => request.header.request_method,
56
+ :request_uri => request.header.create_query_uri,
57
+ :host => request.header.request_uri.host,
58
+ :port => request.header.request_uri.port,
86
59
  :body_hash => self.body_hash,
87
60
  :ext => self.ext
88
- )
89
- @signature = _signature_.calculate
90
- headers.merge(:AUTHORIZATION => authorization_header)
61
+ ).calculate
62
+ request.header['Authorization'] = authorization_header
91
63
  end
92
64
 
65
+ private
66
+
93
67
  def authorization_header
94
68
  header = "MAC"
95
69
  header << " id=\"#{access_token}\","
@@ -102,7 +76,7 @@ module Rack
102
76
  def generate_nonce
103
77
  [
104
78
  (Time.now.utc - @issued_at).to_i,
105
- ActiveSupport::SecureRandom.base64(16)
79
+ ActiveSupport::SecureRandom.hex
106
80
  ].join(':')
107
81
  end
108
82
  end
@@ -51,7 +51,7 @@ module Rack
51
51
  :client_secret => self.secret
52
52
  )
53
53
  handle_response do
54
- RestClient.post absolute_uri_for(token_endpoint), Util.compact_hash(params)
54
+ HTTPClient.new.post absolute_uri_for(token_endpoint), Util.compact_hash(params)
55
55
  end
56
56
  end
57
57
 
@@ -67,6 +67,15 @@ module Rack
67
67
 
68
68
  def handle_response
69
69
  response = yield
70
+ case response.status
71
+ when 200..201
72
+ handle_success_response response
73
+ else
74
+ handle_error_response response
75
+ end
76
+ end
77
+
78
+ def handle_success_response(response)
70
79
  token_hash = JSON.parse(response.body).with_indifferent_access
71
80
  case token_hash[:token_type]
72
81
  when 'bearer'
@@ -81,9 +90,13 @@ module Rack
81
90
  rescue JSON::ParserError
82
91
  # NOTE: Facebook support (They don't use JSON as token response)
83
92
  AccessToken::Legacy.new Rack::Utils.parse_nested_query(response.body).with_indifferent_access
84
- rescue RestClient::Exception => e
85
- error = JSON.parse(e.http_body).with_indifferent_access
86
- raise Error.new(e.http_code, error)
93
+ end
94
+
95
+ def handle_error_response(response)
96
+ error = JSON.parse(response.body).with_indifferent_access
97
+ raise Error.new(response.status, error)
98
+ rescue JSON::ParserError
99
+ raise Error.new(response.status, :error => 'Unknown', :error_description => resonse.body)
87
100
  end
88
101
  end
89
102
  end
data/rack-oauth2.gemspec CHANGED
@@ -15,12 +15,12 @@ Gem::Specification.new do |s|
15
15
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
16
  s.add_runtime_dependency "rack", ">= 1.1"
17
17
  s.add_runtime_dependency "json", ">= 1.4.3"
18
- s.add_runtime_dependency "restclient_with_cert"
18
+ s.add_runtime_dependency "httpclient", ">= 2.2.0.2"
19
19
  s.add_runtime_dependency "activesupport", ">= 2.3"
20
20
  s.add_runtime_dependency "i18n"
21
21
  s.add_runtime_dependency "attr_required", ">= 0.0.3"
22
22
  s.add_development_dependency "rake", ">= 0.8"
23
23
  s.add_development_dependency "rcov", ">= 0.9"
24
24
  s.add_development_dependency "rspec", ">= 2", "<= 2.5"
25
- s.add_development_dependency "fakeweb", ">= 1.3"
25
+ s.add_development_dependency "webmock", ">= 1.6.2"
26
26
  end
@@ -0,0 +1,42 @@
1
+ require 'webmock/rspec'
2
+
3
+ module WebMockHelper
4
+ def mock_response(method, endpoint, response_file, options = {})
5
+ stub_request(method, endpoint).with(
6
+ request_for(method, options)
7
+ ).to_return(
8
+ response_for(response_file, options)
9
+ )
10
+ end
11
+
12
+ private
13
+
14
+ def request_for(method, options = {})
15
+ request = {}
16
+ if options[:access_token]
17
+ options[:params] ||= {}
18
+ options[:params][:oauth_token] = options[:access_token].to_s
19
+ end
20
+ if options[:params]
21
+ case method
22
+ when :post, :put
23
+ request[:body] = options[:params]
24
+ else
25
+ request[:query] = options[:params]
26
+ end
27
+ end
28
+ request
29
+ end
30
+
31
+ def response_for(response_file, options = {})
32
+ response = {}
33
+ response[:body] = File.new(File.join(File.dirname(__FILE__), '../mock_response', response_file))
34
+ if options[:status]
35
+ response[:status] = options[:status]
36
+ end
37
+ response
38
+ end
39
+ end
40
+
41
+ include WebMockHelper
42
+ WebMock.disable_net_connect!
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rack::OAuth2::AccessToken::Authenticator do
4
+ let(:resource_endpoint) { 'https://server.example.com/resources/fake' }
5
+ let(:request) { HTTP::Message.new_request(:get, URI.parse(resource_endpoint)) }
6
+ let(:authenticator) { Rack::OAuth2::AccessToken::Authenticator.new(token) }
7
+
8
+ shared_examples_for :authenticator do
9
+ it 'should let the token authenticate the request' do
10
+ token.should_receive(:authenticate).with(request)
11
+ authenticator.filter_request(request)
12
+ end
13
+ end
14
+
15
+ context 'when Legacy token is given' do
16
+ let(:token) do
17
+ Rack::OAuth2::AccessToken::Legacy.new(
18
+ :access_token => 'access_token'
19
+ )
20
+ end
21
+ it_behaves_like :authenticator
22
+ end
23
+
24
+ context 'when Bearer token is given' do
25
+ let(:token) do
26
+ Rack::OAuth2::AccessToken::Bearer.new(
27
+ :access_token => 'access_token'
28
+ )
29
+ end
30
+ it_behaves_like :authenticator
31
+ end
32
+
33
+ context 'when MAC token is given' do
34
+ let(:token) do
35
+ Rack::OAuth2::AccessToken::MAC.new(
36
+ :access_token => 'access_token',
37
+ :mac_key => 'secret',
38
+ :mac_algorithm => 'hmac-sha-256'
39
+ )
40
+ end
41
+ it_behaves_like :authenticator
42
+ end
43
+ end
@@ -7,37 +7,12 @@ describe Rack::OAuth2::AccessToken::Bearer do
7
7
  )
8
8
  end
9
9
  let(:resource_endpoint) { 'https://server.example.com/resources/fake' }
10
+ let(:request) { HTTPClient.new.send(:create_request, :post, URI.parse(resource_endpoint), {}, {:hello => "world"}, {}) }
10
11
 
11
- [:get, :delete].each do |method|
12
- before do
13
- fake_response(method, resource_endpoint, 'resources/fake.txt')
14
- end
15
-
16
- describe method.to_s.upcase do
17
- it 'should have Bearer Authorization header' do
18
- RestClient.should_receive(method).with(
19
- resource_endpoint,
20
- :AUTHORIZATION => 'Bearer access_token'
21
- )
22
- token.send method, resource_endpoint
23
- end
24
- end
25
- end
26
-
27
- [:post, :put].each do |method|
28
- before do
29
- fake_response(method, resource_endpoint, 'resources/fake.txt')
30
- end
31
-
32
- describe method.to_s.upcase do
33
- it 'should have Bearer Authorization header' do
34
- RestClient.should_receive(method).with(
35
- resource_endpoint,
36
- {:key => :value},
37
- {:AUTHORIZATION => 'Bearer access_token'}
38
- )
39
- token.send method, resource_endpoint, {:key => :value}
40
- end
12
+ describe '.authenticate' do
13
+ it 'should set Authorization header' do
14
+ request.header.should_receive(:[]=).with('Authorization', 'Bearer access_token')
15
+ token.authenticate(request)
41
16
  end
42
17
  end
43
18
  end
@@ -7,42 +7,17 @@ describe Rack::OAuth2::AccessToken::Legacy do
7
7
  )
8
8
  end
9
9
  let(:resource_endpoint) { 'https://server.example.com/resources/fake' }
10
-
11
- [:get, :delete].each do |method|
12
- before do
13
- fake_response(method, resource_endpoint, 'resources/fake.txt')
14
- end
15
-
16
- describe method.to_s.upcase do
17
- it 'should have OAuth2 Authorization header' do
18
- RestClient.should_receive(method).with(
19
- resource_endpoint,
20
- :AUTHORIZATION => 'OAuth2 access_token'
21
- )
22
- token.send method, resource_endpoint
23
- end
24
- end
25
- end
26
-
27
- [:post, :put].each do |method|
28
- before do
29
- fake_response(method, resource_endpoint, 'resources/fake.txt')
30
- end
31
-
32
- describe method.to_s.upcase do
33
- it 'should have OAuth2 Authorization header' do
34
- RestClient.should_receive(method).with(
35
- resource_endpoint,
36
- {:key => :value},
37
- {:AUTHORIZATION => 'OAuth2 access_token'}
38
- )
39
- token.send method, resource_endpoint, {:key => :value}
40
- end
41
- end
42
- end
10
+ let(:request) { HTTPClient.new.send(:create_request, :post, URI.parse(resource_endpoint), {}, {:hello => "world"}, {}) }
43
11
 
44
12
  describe '#to_s' do
45
13
  subject { token }
46
14
  its(:to_s) { should == token.access_token }
47
15
  end
16
+
17
+ describe '.authenticate' do
18
+ it 'should set Authorization header' do
19
+ request.header.should_receive(:[]=).with('Authorization', 'OAuth2 access_token')
20
+ token.authenticate(request)
21
+ end
22
+ end
48
23
  end
@@ -5,9 +5,12 @@ describe Rack::OAuth2::AccessToken::MAC do
5
5
  Rack::OAuth2::AccessToken::MAC.new(
6
6
  :access_token => 'access_token',
7
7
  :mac_key => 'secret',
8
- :mac_algorithm => 'hmac-sha-256'
8
+ :mac_algorithm => 'hmac-sha-256',
9
+ :issued_at => issued_at
9
10
  )
10
11
  end
12
+ let(:issued_at) { 1305820455 }
13
+ let(:nonce) { '1000:51e74de734c05613f37520872e68db5f' }
11
14
  let(:resource_endpoint) { 'https://server.example.com/resources/fake' }
12
15
  subject { token }
13
16
 
@@ -26,63 +29,6 @@ describe Rack::OAuth2::AccessToken::MAC do
26
29
  end
27
30
  its(:generate_nonce) { should be_a String }
28
31
 
29
- describe 'HTTP methods' do
30
- before do
31
- token.should_receive(:generate_nonce).and_return("51e74de734c05613f37520872e68db5f")
32
- end
33
-
34
- describe :GET do
35
- let(:resource_endpoint) { 'https://server.example.com/resources/fake?key=value' }
36
- it 'should have MAC Authorization header' do
37
- Time.fix(Time.at(1302361200)) do
38
- RestClient.should_receive(:get).with(
39
- resource_endpoint,
40
- :AUTHORIZATION => 'MAC id="access_token", nonce="51e74de734c05613f37520872e68db5f", mac="gMJ8AmvTGmfPFCJCf5DUwNTmT7ksw6GqyoGW2lUIUZ0="'
41
- )
42
- token.get resource_endpoint
43
- end
44
- end
45
- end
46
-
47
- describe :POST do
48
- it 'should have MAC Authorization header' do
49
- Time.fix(Time.at(1302361200)) do
50
- RestClient.should_receive(:post).with(
51
- resource_endpoint,
52
- {:key => :value},
53
- {:AUTHORIZATION => 'MAC id="access_token", nonce="51e74de734c05613f37520872e68db5f", bodyhash="Vj8DVxGNBe8UXWvd8pZswj6Gyo8vAT+RXlZa/fCfeiM=", mac="7OOseGqNi14lThhRnwhItACXACM4Qp5GleBEuizzUpw="'}
54
- )
55
- token.post resource_endpoint, :key => :value
56
- end
57
- end
58
- end
59
-
60
- describe :PUT do
61
- it 'should have MAC Authorization header' do
62
- Time.fix(Time.at(1302361200)) do
63
- RestClient.should_receive(:put).with(
64
- resource_endpoint,
65
- {:key => :value},
66
- {:AUTHORIZATION => 'MAC id="access_token", nonce="51e74de734c05613f37520872e68db5f", bodyhash="Vj8DVxGNBe8UXWvd8pZswj6Gyo8vAT+RXlZa/fCfeiM=", mac="lxTg/F29zkE7vBEbAK9VULRpM4IN5uShqHbj2k7e9lA="'}
67
- )
68
- token.put resource_endpoint, :key => :value
69
- end
70
- end
71
- end
72
-
73
- describe :DELETE do
74
- it 'should have MAC Authorization header' do
75
- Time.fix(Time.at(1302361200)) do
76
- RestClient.should_receive(:delete).with(
77
- resource_endpoint,
78
- :AUTHORIZATION => 'MAC id="access_token", nonce="51e74de734c05613f37520872e68db5f", mac="JtOibEO1rBQNBGy6hUPT29L2cHSmLP09K+kUL4oEe/g="'
79
- )
80
- token.delete resource_endpoint
81
- end
82
- end
83
- end
84
- end
85
-
86
32
  describe 'verify!' do
87
33
  let(:request) { Rack::OAuth2::Server::Resource::MAC::Request.new(env) }
88
34
 
@@ -90,16 +36,14 @@ describe Rack::OAuth2::AccessToken::MAC do
90
36
  let(:env) do
91
37
  Rack::MockRequest.env_for(
92
38
  '/protected_resources',
93
- 'HTTP_AUTHORIZATION' => %{MAC id="access_token", nonce="51e74de734c05613f37520872e68db5f", mac="#{signature}"}
39
+ 'HTTP_AUTHORIZATION' => %{MAC id="access_token", nonce="#{nonce}", mac="#{signature}"}
94
40
  )
95
41
  end
96
42
 
97
43
  context 'when signature is valid' do
98
- let(:signature) { 'jWo6L7w86ZKNlkRYjzQxp/HJpSxZJXq60hfd+yw4si0=' }
44
+ let(:signature) { 'nbQj0NdvSBKdwvw1yX6wpQ4EwrQKBg/r3lqwJGcthDU=' }
99
45
  it do
100
- Time.fix(Time.at(1302361200)) do
101
- token.verify!(request.setup!).should == :verified
102
- end
46
+ token.verify!(request.setup!).should == :verified
103
47
  end
104
48
  end
105
49
 
@@ -122,7 +66,7 @@ describe Rack::OAuth2::AccessToken::MAC do
122
66
  :params => {
123
67
  :key1 => 'value1'
124
68
  },
125
- 'HTTP_AUTHORIZATION' => %{MAC id="access_token", nonce="51e74de734c05613f37520872e68db5f", bodyhash="#{body_hash}", mac="#{signature}"}
69
+ 'HTTP_AUTHORIZATION' => %{MAC id="access_token", nonce="#{nonce}", bodyhash="#{body_hash}", mac="#{signature}"}
126
70
  )
127
71
  end
128
72
  let(:signature) { 'invalid' }
@@ -141,7 +85,7 @@ describe Rack::OAuth2::AccessToken::MAC do
141
85
  let(:body_hash) { 'TPzUbFn1S16mpfmwXCi1L+8oZHRxlLX9/D1ZwAV781o=' }
142
86
 
143
87
  context 'when signature is valid' do
144
- let(:signature) { 'xNoae5ETuB9BVFH/vFV8y8S0fXdY41bSq0bekoLClwM=' }
88
+ let(:signature) { 'ebFlQPMO3WzEZ3ncuIFnVK7IsVt+JEorQEEMJTiz/t8=' }
145
89
  it do
146
90
  Time.fix(Time.at(1302361200)) do
147
91
  token.verify!(request.setup!).should == :verified
@@ -160,4 +104,16 @@ describe Rack::OAuth2::AccessToken::MAC do
160
104
  end
161
105
  end
162
106
  end
107
+
108
+ describe '.authenticate' do
109
+ let(:request) { HTTPClient.new.send(:create_request, :post, URI.parse(resource_endpoint), {}, {:hello => "world"}, {}) }
110
+ let(:body_hash) { 'PQEeCVAqhFUqD4rhEtAkzCwRVZfjpXfV9JAHkCwiHcU=' }
111
+ let(:signature) { 'aL2Oh8gWrCAtJ/Xu6XMtJb6ZsYQT+GxQTs/TgJDQ7ZY=' }
112
+
113
+ it 'should set Authorization header' do
114
+ token.should_receive(:generate_nonce).and_return(nonce)
115
+ request.header.should_receive(:[]=).with('Authorization', "MAC id=\"access_token\", nonce=\"#{nonce}\", bodyhash=\"#{body_hash}\", mac=\"#{signature}\"")
116
+ token.authenticate(request)
117
+ end
118
+ end
163
119
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Rack::OAuth2::AccessToken do
4
- subject do
4
+ let :token do
5
5
  Rack::OAuth2::AccessToken::Bearer.new(
6
6
  :access_token => 'access_token',
7
7
  :refresh_token => 'refresh_token',
@@ -9,6 +9,7 @@ describe Rack::OAuth2::AccessToken do
9
9
  :scope => [:scope1, :scope2]
10
10
  )
11
11
  end
12
+ subject { token }
12
13
 
13
14
  its(:access_token) { should == 'access_token' }
14
15
  its(:refresh_token) { should == 'refresh_token' }
@@ -45,4 +46,15 @@ describe Rack::OAuth2::AccessToken do
45
46
  end.should_not raise_error
46
47
  end
47
48
  end
49
+
50
+ let(:resource_endpoint) { 'https://server.example.com/resources/fake' }
51
+ [:get, :delete, :post, :put].each do |method|
52
+ describe method do
53
+ it 'should delegate to HTTPClient with Authenticator filter' do
54
+ token.client.should_receive(method).with(resource_endpoint)
55
+ token.client.request_filter.last.should be_a Rack::OAuth2::AccessToken::Authenticator
56
+ token.send method, resource_endpoint
57
+ end
58
+ end
59
+ end
48
60
  end
@@ -77,7 +77,7 @@ describe Rack::OAuth2::Client do
77
77
  context 'when bearer token is given' do
78
78
  before do
79
79
  client.authorization_code = 'code'
80
- fake_response(
80
+ mock_response(
81
81
  :post,
82
82
  'https://server.example.com/oauth2/token',
83
83
  'tokens/bearer.json'
@@ -93,7 +93,7 @@ describe Rack::OAuth2::Client do
93
93
  context 'when mac token is given' do
94
94
  before do
95
95
  client.authorization_code = 'code'
96
- fake_response(
96
+ mock_response(
97
97
  :post,
98
98
  'https://server.example.com/oauth2/token',
99
99
  'tokens/mac.json'
@@ -109,7 +109,7 @@ describe Rack::OAuth2::Client do
109
109
  context 'when no-type token is given (JSON)' do
110
110
  before do
111
111
  client.authorization_code = 'code'
112
- fake_response(
112
+ mock_response(
113
113
  :post,
114
114
  'https://server.example.com/oauth2/token',
115
115
  'tokens/legacy.json'
@@ -124,7 +124,7 @@ describe Rack::OAuth2::Client do
124
124
 
125
125
  context 'when no-type token is given (key-value)' do
126
126
  before do
127
- fake_response(
127
+ mock_response(
128
128
  :post,
129
129
  'https://server.example.com/oauth2/token',
130
130
  'tokens/legacy.txt'
@@ -137,7 +137,7 @@ describe Rack::OAuth2::Client do
137
137
 
138
138
  context 'when expires_in is not given' do
139
139
  before do
140
- fake_response(
140
+ mock_response(
141
141
  :post,
142
142
  'https://server.example.com/oauth2/token',
143
143
  'tokens/legacy_without_expires_in.txt'
@@ -150,7 +150,7 @@ describe Rack::OAuth2::Client do
150
150
  context 'when unknown-type token is given' do
151
151
  before do
152
152
  client.authorization_code = 'code'
153
- fake_response(
153
+ mock_response(
154
154
  :post,
155
155
  'https://server.example.com/oauth2/token',
156
156
  'tokens/unknown.json'
@@ -163,7 +163,7 @@ describe Rack::OAuth2::Client do
163
163
 
164
164
  context 'when error response is given' do
165
165
  before do
166
- fake_response(
166
+ mock_response(
167
167
  :post,
168
168
  'https://server.example.com/oauth2/token',
169
169
  'errors/invalid_request.json',
data/spec/spec_helper.rb CHANGED
@@ -1,23 +1,10 @@
1
- require 'rack/oauth2'
2
1
  require 'rspec'
3
- require 'fakeweb'
2
+ require 'rack/oauth2'
4
3
  require 'helpers/time'
4
+ require 'helpers/webmock_helper'
5
5
 
6
6
  def simple_app
7
7
  lambda do |env|
8
8
  [ 200, {'Content-Type' => 'text/plain'}, ["HELLO"] ]
9
9
  end
10
10
  end
11
-
12
- def fake_response(method, endpoint, file_path, options = {})
13
- FakeWeb.register_uri(
14
- method,
15
- endpoint,
16
- options.merge(
17
- :body => File.read(
18
- File.join(File.dirname(__FILE__), 'fake_response', file_path)
19
- )
20
- )
21
- )
22
- end
23
- FakeWeb.allow_net_connect = false
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-oauth2
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.7.0
4
+ prerelease: 6
5
+ version: 0.8.0.alpha
6
6
  platform: ruby
7
7
  authors:
8
8
  - nov matake
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-18 00:00:00 Z
13
+ date: 2011-05-19 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
@@ -35,14 +35,14 @@ dependencies:
35
35
  type: :runtime
36
36
  version_requirements: *id002
37
37
  - !ruby/object:Gem::Dependency
38
- name: restclient_with_cert
38
+ name: httpclient
39
39
  prerelease: false
40
40
  requirement: &id003 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
- version: "0"
45
+ version: 2.2.0.2
46
46
  type: :runtime
47
47
  version_requirements: *id003
48
48
  - !ruby/object:Gem::Dependency
@@ -115,14 +115,14 @@ dependencies:
115
115
  type: :development
116
116
  version_requirements: *id009
117
117
  - !ruby/object:Gem::Dependency
118
- name: fakeweb
118
+ name: webmock
119
119
  prerelease: false
120
120
  requirement: &id010 !ruby/object:Gem::Requirement
121
121
  none: false
122
122
  requirements:
123
123
  - - ">="
124
124
  - !ruby/object:Gem::Version
125
- version: "1.3"
125
+ version: 1.6.2
126
126
  type: :development
127
127
  version_requirements: *id010
128
128
  description: OAuth 2.0 Server & Client Library. Both Bearer and MAC token type are supported.
@@ -146,6 +146,7 @@ files:
146
146
  - VERSION
147
147
  - lib/rack/oauth2.rb
148
148
  - lib/rack/oauth2/access_token.rb
149
+ - lib/rack/oauth2/access_token/authenticator.rb
149
150
  - lib/rack/oauth2/access_token/bearer.rb
150
151
  - lib/rack/oauth2/access_token/legacy.rb
151
152
  - lib/rack/oauth2/access_token/mac.rb
@@ -183,15 +184,17 @@ files:
183
184
  - lib/rack/oauth2/server/token/refresh_token.rb
184
185
  - lib/rack/oauth2/util.rb
185
186
  - rack-oauth2.gemspec
186
- - spec/fake_response/errors/invalid_request.json
187
- - spec/fake_response/resources/fake.txt
188
- - spec/fake_response/tokens/bearer.json
189
- - spec/fake_response/tokens/legacy.json
190
- - spec/fake_response/tokens/legacy.txt
191
- - spec/fake_response/tokens/legacy_without_expires_in.txt
192
- - spec/fake_response/tokens/mac.json
193
- - spec/fake_response/tokens/unknown.json
194
187
  - spec/helpers/time.rb
188
+ - spec/helpers/webmock_helper.rb
189
+ - spec/mock_response/errors/invalid_request.json
190
+ - spec/mock_response/resources/fake.txt
191
+ - spec/mock_response/tokens/bearer.json
192
+ - spec/mock_response/tokens/legacy.json
193
+ - spec/mock_response/tokens/legacy.txt
194
+ - spec/mock_response/tokens/legacy_without_expires_in.txt
195
+ - spec/mock_response/tokens/mac.json
196
+ - spec/mock_response/tokens/unknown.json
197
+ - spec/rack/oauth2/access_token/authenticator_spec.rb
195
198
  - spec/rack/oauth2/access_token/bearer_spec.rb
196
199
  - spec/rack/oauth2/access_token/legacy_spec.rb
197
200
  - spec/rack/oauth2/access_token/mac/body_hash_spec.rb
@@ -248,15 +251,17 @@ signing_key:
248
251
  specification_version: 3
249
252
  summary: OAuth 2.0 Server & Client Library - Both Bearer and MAC token type are supported
250
253
  test_files:
251
- - spec/fake_response/errors/invalid_request.json
252
- - spec/fake_response/resources/fake.txt
253
- - spec/fake_response/tokens/bearer.json
254
- - spec/fake_response/tokens/legacy.json
255
- - spec/fake_response/tokens/legacy.txt
256
- - spec/fake_response/tokens/legacy_without_expires_in.txt
257
- - spec/fake_response/tokens/mac.json
258
- - spec/fake_response/tokens/unknown.json
259
254
  - spec/helpers/time.rb
255
+ - spec/helpers/webmock_helper.rb
256
+ - spec/mock_response/errors/invalid_request.json
257
+ - spec/mock_response/resources/fake.txt
258
+ - spec/mock_response/tokens/bearer.json
259
+ - spec/mock_response/tokens/legacy.json
260
+ - spec/mock_response/tokens/legacy.txt
261
+ - spec/mock_response/tokens/legacy_without_expires_in.txt
262
+ - spec/mock_response/tokens/mac.json
263
+ - spec/mock_response/tokens/unknown.json
264
+ - spec/rack/oauth2/access_token/authenticator_spec.rb
260
265
  - spec/rack/oauth2/access_token/bearer_spec.rb
261
266
  - spec/rack/oauth2/access_token/legacy_spec.rb
262
267
  - spec/rack/oauth2/access_token/mac/body_hash_spec.rb