rack-oauth2 0.8.7 → 0.9.0.alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rack-oauth2 (0.8.6)
4
+ rack-oauth2 (0.8.7)
5
5
  activesupport (>= 2.3)
6
6
  attr_required (>= 0.0.3)
7
7
  httpclient (>= 2.2.0.2)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.7
1
+ 0.9.0.alpha
@@ -4,11 +4,35 @@ module Rack
4
4
  class Authorize < Abstract::Handler
5
5
  def call(env)
6
6
  request = Request.new(env)
7
- request.profile.new(&@authenticator).call(env).finish
7
+ response_type_for(request).new(&@authenticator).call(env).finish
8
8
  rescue Rack::OAuth2::Server::Abstract::Error => e
9
9
  e.finish
10
10
  end
11
11
 
12
+ private
13
+
14
+ def response_type_for(request)
15
+ response_type = request.params['response_type'].to_s
16
+ case response_type
17
+ when 'code'
18
+ Code
19
+ when 'token'
20
+ Token
21
+ when ''
22
+ request.attr_missing!
23
+ else
24
+ extensions.detect do |extension|
25
+ extension.response_type_for? response_type
26
+ end || request.unsupported_response_type!
27
+ end
28
+ end
29
+
30
+ def extensions
31
+ Extensions.constants.sort.collect do |key|
32
+ Extensions.const_get key
33
+ end
34
+ end
35
+
12
36
  class Request < Abstract::Request
13
37
  attr_required :response_type
14
38
  attr_optional :redirect_uri, :state
@@ -22,20 +46,6 @@ module Rack
22
46
  @state = params['state']
23
47
  end
24
48
 
25
- def profile
26
- case params['response_type'].to_s
27
- when 'code'
28
- Code
29
- when 'token'
30
- Token
31
- when ''
32
- attr_missing!
33
- else
34
- # TODO: support extensions
35
- unsupported_response_type!
36
- end
37
- end
38
-
39
49
  def verify_redirect_uri!(pre_registered)
40
50
  @verified_redirect_uri = if redirect_uri.present?
41
51
  if Util.uri_match?(pre_registered, redirect_uri)
@@ -48,6 +58,10 @@ module Rack
48
58
  end
49
59
  self.verified_redirect_uri.to_s
50
60
  end
61
+
62
+ def error_params_location
63
+ nil # => All errors are raised immediately and no error response are returned to client.
64
+ end
51
65
  end
52
66
 
53
67
  class Response < Abstract::Response
@@ -71,10 +85,14 @@ module Rack
71
85
  {:state => state}
72
86
  end
73
87
 
88
+ def redirect_uri_with_credentials
89
+ Util.redirect_uri(redirect_uri, protocol_params_location, protocol_params)
90
+ end
91
+
74
92
  def finish
75
93
  if approved?
76
94
  attr_missing!
77
- redirect Util.redirect_uri(redirect_uri, protocol_params_location, protocol_params)
95
+ redirect redirect_uri_with_credentials
78
96
  end
79
97
  super
80
98
  end
@@ -86,4 +104,5 @@ end
86
104
 
87
105
  require 'rack/oauth2/server/authorize/code'
88
106
  require 'rack/oauth2/server/authorize/token'
107
+ require 'rack/oauth2/server/authorize/extensions'
89
108
  require 'rack/oauth2/server/authorize/error'
@@ -15,6 +15,10 @@ module Rack
15
15
  @response_type = :code
16
16
  attr_missing!
17
17
  end
18
+
19
+ def error_params_location
20
+ :query
21
+ end
18
22
  end
19
23
 
20
24
  class Response < Authorize::Response
@@ -57,12 +57,7 @@ module Rack
57
57
 
58
58
  def bad_request!(error = :bad_request, description = nil, options = {})
59
59
  exception = BadRequest.new error, description, options
60
- exception.protocol_params_location = case response_type
61
- when :code
62
- :query
63
- when :token
64
- :fragment
65
- end
60
+ exception.protocol_params_location = error_params_location
66
61
  exception.state = state
67
62
  exception.redirect_uri = verified_redirect_uri
68
63
  raise exception
@@ -0,0 +1,12 @@
1
+ module Rack
2
+ module OAuth2
3
+ module Server
4
+ class Authorize
5
+ module Extensions
6
+ # Define your extension in this namespace and load it explicitly.
7
+ # extensions/code_and_token.rb would be good example for you.
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,39 @@
1
+ module Rack
2
+ module OAuth2
3
+ module Server
4
+ class Authorize
5
+ module Extensions
6
+ class CodeAndToken < Abstract::Handler
7
+ class << self
8
+ def response_type_for?(response_type)
9
+ response_type.split.sort == ['code', 'token']
10
+ end
11
+ end
12
+
13
+ def call(env)
14
+ @request = Request.new env
15
+ @response = Response.new request
16
+ super
17
+ end
18
+
19
+ class Request < Authorize::Token::Request
20
+ def initialize(env)
21
+ super
22
+ @response_type = [:code, :token]
23
+ attr_missing!
24
+ end
25
+ end
26
+
27
+ class Response < Authorize::Token::Response
28
+ attr_required :code
29
+
30
+ def redirect_uri_with_credentials
31
+ Util.redirect_uri(super, :query, :code => code)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -15,6 +15,10 @@ module Rack
15
15
  @response_type = :token
16
16
  attr_missing!
17
17
  end
18
+
19
+ def error_params_location
20
+ :fragment
21
+ end
18
22
  end
19
23
 
20
24
  class Response < Authorize::Response
@@ -0,0 +1,54 @@
1
+ require 'spec_helper.rb'
2
+ require 'rack/oauth2/server/authorize/extensions/code_and_token'
3
+
4
+ describe Rack::OAuth2::Server::Authorize::Extensions::CodeAndToken do
5
+ let(:request) { Rack::MockRequest.new app }
6
+ let(:redirect_uri) { 'http://client.example.com/callback' }
7
+ let(:access_token) { 'access_token' }
8
+ let(:authorization_code) { 'authorization_code' }
9
+ let(:response) do
10
+ request.get("/?response_type=code%20token&client_id=client&redirect_uri=#{redirect_uri}")
11
+ end
12
+
13
+ context "when approved" do
14
+ subject { response }
15
+ let(:bearer_token) { Rack::OAuth2::AccessToken::Bearer.new(:access_token => access_token) }
16
+ let :app do
17
+ Rack::OAuth2::Server::Authorize.new do |request, response|
18
+ response.redirect_uri = redirect_uri
19
+ response.access_token = bearer_token
20
+ response.code = authorization_code
21
+ response.approve!
22
+ end
23
+ end
24
+ its(:status) { should == 302 }
25
+ its(:location) { should == "#{redirect_uri}?code=#{authorization_code}#access_token=#{access_token}&token_type=bearer" }
26
+
27
+ context 'when refresh_token is given' do
28
+ let :bearer_token do
29
+ Rack::OAuth2::AccessToken::Bearer.new(
30
+ :access_token => access_token,
31
+ :refresh_token => 'refresh'
32
+ )
33
+ end
34
+ its(:location) { should == "#{redirect_uri}?code=#{authorization_code}#access_token=#{access_token}&token_type=bearer" }
35
+ end
36
+ end
37
+
38
+ context 'when denied' do
39
+ let :app do
40
+ Rack::OAuth2::Server::Authorize.new do |request, response|
41
+ request.verify_redirect_uri! redirect_uri
42
+ request.access_denied!
43
+ end
44
+ end
45
+ it 'should redirect with error in fragment' do
46
+ response.status.should == 302
47
+ error_message = {
48
+ :error => :access_denied,
49
+ :error_description => Rack::OAuth2::Server::Authorize::ErrorMethods::DEFAULT_DESCRIPTION[:access_denied]
50
+ }
51
+ response.location.should == "#{redirect_uri}##{error_message.to_query}"
52
+ end
53
+ end
54
+ end
@@ -7,6 +7,7 @@ describe Rack::OAuth2::Server::Authorize::Token do
7
7
  let(:response) { request.get("/?response_type=token&client_id=client&redirect_uri=#{redirect_uri}") }
8
8
 
9
9
  context "when approved" do
10
+ subject { response }
10
11
  let(:bearer_token) { Rack::OAuth2::AccessToken::Bearer.new(:access_token => access_token) }
11
12
  let :app do
12
13
  Rack::OAuth2::Server::Authorize.new do |request, response|
@@ -15,11 +16,8 @@ describe Rack::OAuth2::Server::Authorize::Token do
15
16
  response.approve!
16
17
  end
17
18
  end
18
-
19
- it 'should redirect with authorization code in fragment' do
20
- response.status.should == 302
21
- response.location.should == "#{redirect_uri}#access_token=#{access_token}&token_type=bearer"
22
- end
19
+ its(:status) { should == 302 }
20
+ its(:location) { should == "#{redirect_uri}#access_token=#{access_token}&token_type=bearer" }
23
21
 
24
22
  context 'when refresh_token is given' do
25
23
  let :bearer_token do
@@ -28,11 +26,7 @@ describe Rack::OAuth2::Server::Authorize::Token do
28
26
  :refresh_token => 'refresh'
29
27
  )
30
28
  end
31
-
32
- it 'should remove refresh_token from response' do
33
- response.status.should == 302
34
- response.location.should == "#{redirect_uri}#access_token=#{access_token}&token_type=bearer"
35
- end
29
+ its(:location) { should == "#{redirect_uri}#access_token=#{access_token}&token_type=bearer" }
36
30
  end
37
31
 
38
32
  context 'when redirect_uri is missing' do
@@ -6,24 +6,21 @@ describe Rack::OAuth2::Server::Authorize do
6
6
  let(:redirect_uri) { 'http://client.example.com/callback' }
7
7
  let(:bad_request) { Rack::OAuth2::Server::Authorize::BadRequest }
8
8
 
9
- context 'when redirect_uri is missing' do
9
+ context 'when response_type is missing' do
10
10
  it do
11
- expect { request.get '/' }.should raise_error bad_request
11
+ expect { request.get "/?client_id=client&redirect_uri=#{redirect_uri}" }.should raise_error bad_request
12
12
  end
13
13
  end
14
14
 
15
- context 'when redirect_uri is given' do
16
- context 'when client_id is missing' do
17
- it do
18
- expect { request.get "/?redirect_uri=#{redirect_uri}" }.should raise_error bad_request
19
- end
15
+ context 'when redirect_uri is missing' do
16
+ it do
17
+ expect { request.get "/?response_type=code&client_id=client" }.should_not raise_error
20
18
  end
21
- context 'when client_id is given' do
22
- context 'when response_type is missing' do
23
- it do
24
- expect { request.get "/?client_id=client&redirect_uri=#{redirect_uri}" }.should raise_error bad_request
25
- end
26
- end
19
+ end
20
+
21
+ context 'when client_id is missing' do
22
+ it do
23
+ expect { request.get "/?response_type=code&redirect_uri=#{redirect_uri}" }.should raise_error bad_request
27
24
  end
28
25
  end
29
26
 
@@ -71,4 +68,67 @@ describe Rack::OAuth2::Server::Authorize do
71
68
  end
72
69
  end
73
70
  end
71
+
72
+ describe 'extensions' do
73
+ before do
74
+ require 'rack/oauth2/server/authorize/extensions/code_and_token'
75
+ end
76
+
77
+ let(:env) do
78
+ Rack::MockRequest.env_for("/authorize?response_type=#{response_type}&client_id=client")
79
+ end
80
+ let(:request) { Rack::OAuth2::Server::Authorize::Request.new env }
81
+ its(:extensions) { should == [Rack::OAuth2::Server::Authorize::Extensions::CodeAndToken] }
82
+
83
+ describe 'code token' do
84
+ let(:response_type) { 'code%20token' }
85
+ it do
86
+ app.send(
87
+ :response_type_for, request
88
+ ).should == Rack::OAuth2::Server::Authorize::Extensions::CodeAndToken
89
+ end
90
+ end
91
+
92
+ describe 'token code' do
93
+ let(:response_type) { 'token%20code' }
94
+ it do
95
+ app.send(
96
+ :response_type_for, request
97
+ ).should == Rack::OAuth2::Server::Authorize::Extensions::CodeAndToken
98
+ end
99
+ end
100
+
101
+ describe 'token code id_token' do
102
+ let(:response_type) { 'token%20code%20id_token' }
103
+ it do
104
+ expect do
105
+ app.send(:response_type_for, request)
106
+ end.should raise_error bad_request
107
+ end
108
+ end
109
+
110
+ describe 'id_token' do
111
+ before do
112
+ class Rack::OAuth2::Server::Authorize::Extensions::IdToken < Rack::OAuth2::Server::Abstract::Handler
113
+ def self.response_type_for?(response_type)
114
+ response_type == 'id_token'
115
+ end
116
+ end
117
+ end
118
+
119
+ its(:extensions) do
120
+ should == [
121
+ Rack::OAuth2::Server::Authorize::Extensions::CodeAndToken,
122
+ Rack::OAuth2::Server::Authorize::Extensions::IdToken
123
+ ]
124
+ end
125
+
126
+ let(:response_type) { 'id_token' }
127
+ it do
128
+ app.send(
129
+ :response_type_for, request
130
+ ).should == Rack::OAuth2::Server::Authorize::Extensions::IdToken
131
+ end
132
+ end
133
+ end
74
134
  end
metadata CHANGED
@@ -1,8 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-oauth2
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.8.7
4
+ hash: -1851332106
5
+ prerelease: 6
6
+ segments:
7
+ - 0
8
+ - 9
9
+ - 0
10
+ - alpha
11
+ version: 0.9.0.alpha
6
12
  platform: ruby
7
13
  authors:
8
14
  - nov matake
@@ -10,7 +16,7 @@ autorequire:
10
16
  bindir: bin
11
17
  cert_chain: []
12
18
 
13
- date: 2011-08-10 00:00:00 Z
19
+ date: 2011-08-11 00:00:00 Z
14
20
  dependencies:
15
21
  - !ruby/object:Gem::Dependency
16
22
  name: rack
@@ -20,6 +26,10 @@ dependencies:
20
26
  requirements:
21
27
  - - ">="
22
28
  - !ruby/object:Gem::Version
29
+ hash: 13
30
+ segments:
31
+ - 1
32
+ - 1
23
33
  version: "1.1"
24
34
  type: :runtime
25
35
  version_requirements: *id001
@@ -31,6 +41,11 @@ dependencies:
31
41
  requirements:
32
42
  - - ">="
33
43
  - !ruby/object:Gem::Version
44
+ hash: 1
45
+ segments:
46
+ - 1
47
+ - 4
48
+ - 3
34
49
  version: 1.4.3
35
50
  type: :runtime
36
51
  version_requirements: *id002
@@ -42,6 +57,12 @@ dependencies:
42
57
  requirements:
43
58
  - - ">="
44
59
  - !ruby/object:Gem::Version
60
+ hash: 123
61
+ segments:
62
+ - 2
63
+ - 2
64
+ - 0
65
+ - 2
45
66
  version: 2.2.0.2
46
67
  type: :runtime
47
68
  version_requirements: *id003
@@ -53,6 +74,10 @@ dependencies:
53
74
  requirements:
54
75
  - - ">="
55
76
  - !ruby/object:Gem::Version
77
+ hash: 5
78
+ segments:
79
+ - 2
80
+ - 3
56
81
  version: "2.3"
57
82
  type: :runtime
58
83
  version_requirements: *id004
@@ -64,6 +89,9 @@ dependencies:
64
89
  requirements:
65
90
  - - ">="
66
91
  - !ruby/object:Gem::Version
92
+ hash: 3
93
+ segments:
94
+ - 0
67
95
  version: "0"
68
96
  type: :runtime
69
97
  version_requirements: *id005
@@ -75,6 +103,11 @@ dependencies:
75
103
  requirements:
76
104
  - - ">="
77
105
  - !ruby/object:Gem::Version
106
+ hash: 25
107
+ segments:
108
+ - 0
109
+ - 0
110
+ - 3
78
111
  version: 0.0.3
79
112
  type: :runtime
80
113
  version_requirements: *id006
@@ -86,6 +119,10 @@ dependencies:
86
119
  requirements:
87
120
  - - ">="
88
121
  - !ruby/object:Gem::Version
122
+ hash: 27
123
+ segments:
124
+ - 0
125
+ - 8
89
126
  version: "0.8"
90
127
  type: :development
91
128
  version_requirements: *id007
@@ -97,6 +134,10 @@ dependencies:
97
134
  requirements:
98
135
  - - ">="
99
136
  - !ruby/object:Gem::Version
137
+ hash: 25
138
+ segments:
139
+ - 0
140
+ - 9
100
141
  version: "0.9"
101
142
  type: :development
102
143
  version_requirements: *id008
@@ -108,6 +149,9 @@ dependencies:
108
149
  requirements:
109
150
  - - ">="
110
151
  - !ruby/object:Gem::Version
152
+ hash: 7
153
+ segments:
154
+ - 2
111
155
  version: "2"
112
156
  type: :development
113
157
  version_requirements: *id009
@@ -119,6 +163,11 @@ dependencies:
119
163
  requirements:
120
164
  - - ">="
121
165
  - !ruby/object:Gem::Version
166
+ hash: 11
167
+ segments:
168
+ - 1
169
+ - 6
170
+ - 2
122
171
  version: 1.6.2
123
172
  type: :development
124
173
  version_requirements: *id010
@@ -166,6 +215,8 @@ files:
166
215
  - lib/rack/oauth2/server/authorize.rb
167
216
  - lib/rack/oauth2/server/authorize/code.rb
168
217
  - lib/rack/oauth2/server/authorize/error.rb
218
+ - lib/rack/oauth2/server/authorize/extensions.rb
219
+ - lib/rack/oauth2/server/authorize/extensions/code_and_token.rb
169
220
  - lib/rack/oauth2/server/authorize/token.rb
170
221
  - lib/rack/oauth2/server/resource.rb
171
222
  - lib/rack/oauth2/server/resource/bearer.rb
@@ -208,6 +259,7 @@ files:
208
259
  - spec/rack/oauth2/server/abstract/error_spec.rb
209
260
  - spec/rack/oauth2/server/authorize/code_spec.rb
210
261
  - spec/rack/oauth2/server/authorize/error_spec.rb
262
+ - spec/rack/oauth2/server/authorize/extensions/code_and_token_spec.rb
211
263
  - spec/rack/oauth2/server/authorize/token_spec.rb
212
264
  - spec/rack/oauth2/server/authorize_spec.rb
213
265
  - spec/rack/oauth2/server/resource/bearer/error_spec.rb
@@ -237,12 +289,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
237
289
  requirements:
238
290
  - - ">="
239
291
  - !ruby/object:Gem::Version
292
+ hash: 3
293
+ segments:
294
+ - 0
240
295
  version: "0"
241
296
  required_rubygems_version: !ruby/object:Gem::Requirement
242
297
  none: false
243
298
  requirements:
244
299
  - - ">="
245
300
  - !ruby/object:Gem::Version
301
+ hash: 23
302
+ segments:
303
+ - 1
304
+ - 3
305
+ - 6
246
306
  version: 1.3.6
247
307
  requirements: []
248
308
 
@@ -279,6 +339,7 @@ test_files:
279
339
  - spec/rack/oauth2/server/abstract/error_spec.rb
280
340
  - spec/rack/oauth2/server/authorize/code_spec.rb
281
341
  - spec/rack/oauth2/server/authorize/error_spec.rb
342
+ - spec/rack/oauth2/server/authorize/extensions/code_and_token_spec.rb
282
343
  - spec/rack/oauth2/server/authorize/token_spec.rb
283
344
  - spec/rack/oauth2/server/authorize_spec.rb
284
345
  - spec/rack/oauth2/server/resource/bearer/error_spec.rb