Skip to content

Commit 0db6b55

Browse files
committed
big refactoring before start working on draft v.11
still halfway
1 parent 09864d1 commit 0db6b55

13 files changed

+75
-84
lines changed

lib/rack/oauth2/server.rb

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
require 'rack/oauth2/server/util'
22
require 'rack/oauth2/server/error'
3+
require 'rack/oauth2/server/required_params'
34
require 'rack/oauth2/server/abstract'
45
require 'rack/oauth2/server/authorize'
56
require 'rack/oauth2/server/token'

lib/rack/oauth2/server/abstract/request.rb

+10-18
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,25 @@ module OAuth2
33
module Server
44
module Abstract
55
class Request < Rack::Request
6-
attr_accessor :client_id, :scope
6+
include RequiredParams
7+
attr_required :client_id
8+
attr_accessor :scope
79

810
def initialize(env)
911
super
10-
missing_params = verify_required_params
1112
@client_id ||= params['client_id']
1213
@scope = Array(params['scope'].to_s.split(' '))
13-
missing_params << :client_id if @client_id.blank?
14-
unless missing_params.blank?
15-
invalid_request!("'#{missing_params.join('\', \'')}' required.", :state => @state, :redirect_uri => @redirect_uri)
16-
end
17-
if params['client_id'].present? && @client_id != params['client_id']
18-
invalid_client!("Multiple client credentials are provided.")
19-
end
2014
end
2115

22-
def required_params
23-
[]
24-
end
25-
26-
def verify_required_params
27-
missing_params = []
28-
required_params.each do |key|
29-
missing_params << key unless params[key.to_s]
16+
def verify_required_params_with_error_handling!
17+
if params['client_id'].present? && @client_id != params['client_id']
18+
invalid_client!("Multiple client credentials are provided.")
3019
end
31-
missing_params
20+
verify_required_params_without_error_handling!
21+
rescue ParameterMissing => e
22+
invalid_request!(e.message, :state => @state, :redirect_uri => @redirect_uri)
3223
end
24+
alias_method_chain :verify_required_params!, :error_handling
3325

3426
end
3527
end

lib/rack/oauth2/server/abstract/response.rb

+2-14
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,12 @@ module OAuth2
33
module Server
44
module Abstract
55
class Response < Rack::Response
6+
include RequiredParams
7+
68
def initialize(request)
79
super([], 200, {})
810
end
911

10-
def required_params
11-
[]
12-
end
13-
14-
def verify_required_params!
15-
missing_params = []
16-
required_params.each do |key|
17-
missing_params << key unless self.send(key)
18-
end
19-
unless missing_params.blank?
20-
raise "Setup '#{missing_params.join('\', \'')}' first!"
21-
end
22-
end
23-
2412
def finish
2513
verify_required_params!
2614
super

lib/rack/oauth2/server/authorize.rb

+6-7
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,25 @@ def call(env)
1212

1313
class Request < Abstract::Request
1414
include Error::Authorize
15-
attr_accessor :response_type, :redirect_uri, :state
15+
attr_required :response_type
16+
attr_accessor :redirect_uri, :state
1617

1718
def initialize(env)
1819
super
19-
@state = params['state']
2020
@redirect_uri = Util.parse_uri(params['redirect_uri']) if params['redirect_uri']
21-
end
22-
23-
def required_params
24-
super + [:response_type]
21+
@state = params['state']
2522
end
2623

2724
def profile
28-
case params['response_type']
25+
case params['response_type'].to_s
2926
when 'code'
3027
Code
3128
when 'token'
3229
Token
3330
when 'code_and_token'
3431
CodeAndToken
32+
when ''
33+
verify_required_params!
3534
else
3635
unsupported_response_type!("'#{params['response_type']}' isn't supported.")
3736
end

lib/rack/oauth2/server/authorize/code.rb

+3-5
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,13 @@ class Request < Authorize::Request
1414
def initialize(env)
1515
super
1616
@response_type = :code
17+
p self
18+
verify_required_params!
1719
end
1820
end
1921

2022
class Response < Authorize::Response
21-
attr_accessor :code
22-
23-
def required_params
24-
super + [:code]
25-
end
23+
attr_required :code
2624

2725
def finish
2826
if approved?

lib/rack/oauth2/server/authorize/code_and_token.rb

+3-5
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,13 @@ class Request < Authorize::Request
1414
def initialize(env)
1515
super
1616
@response_type = :code_and_token
17+
verify_required_params!
1718
end
1819
end
1920

2021
class Response < Authorize::Response
21-
attr_accessor :code, :access_token, :expires_in, :scope
22-
23-
def required_params
24-
super + [:code, :access_token]
25-
end
22+
attr_required :code, :access_token
23+
attr_accessor :expires_in, :scope
2624

2725
def finish
2826
if approved?

lib/rack/oauth2/server/authorize/token.rb

+3-5
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,13 @@ class Request < Authorize::Request
1414
def initialize(env)
1515
super
1616
@response_type = :token
17+
verify_required_params!
1718
end
1819
end
1920

2021
class Response < Authorize::Response
21-
attr_accessor :access_token, :expires_in, :scope
22-
23-
def required_params
24-
super + [:access_token]
25-
end
22+
attr_required :access_token
23+
attr_accessor :expires_in, :scope
2624

2725
def finish
2826
if approved?
+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
module Rack
2+
module OAuth2
3+
module Server
4+
module RequiredParams
5+
class ParameterMissing < StandardError; end
6+
7+
def self.included(klass)
8+
class << klass
9+
10+
def attr_required(*keys)
11+
@required_params = if superclass.respond_to?(:"#{type}_params")
12+
superclass.send(:"#{type}_params")
13+
else
14+
[]
15+
end
16+
@required_params += Array(keys)
17+
attr_accessor *keys
18+
end
19+
20+
def required_params
21+
@required_params || []
22+
end
23+
24+
end
25+
end
26+
27+
def missing_params
28+
self.class.required_params.select do |key|
29+
self.send(key).blank?
30+
end
31+
end
32+
33+
def verify_required_params!
34+
raise ParameterMissing.new("'#{missing_params.join('\', \'')}' required.") if missing_params.present?
35+
end
36+
end
37+
end
38+
end
39+
end

lib/rack/oauth2/server/token.rb

+4-10
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ def call(env)
1515
class Request < Abstract::Request
1616
include Error::Token
1717

18-
attr_accessor :grant_type, :client_secret, :via_authorization_header
18+
attr_required :grant_type
19+
attr_accessor :client_secret, :via_authorization_header
1920

2021
def initialize(env)
2122
auth = Rack::Auth::Basic::Request.new(env)
@@ -30,10 +31,6 @@ def initialize(env)
3031
@grant_type = params['grant_type']
3132
end
3233

33-
def required_params
34-
super + [:grant_type]
35-
end
36-
3734
def profile(allow_no_profile = false)
3835
case params['grant_type']
3936
when 'authorization_code'
@@ -52,11 +49,8 @@ def profile(allow_no_profile = false)
5249
end
5350

5451
class Response < Abstract::Response
55-
attr_accessor :access_token, :expires_in, :refresh_token, :scope
56-
57-
def required_params
58-
super + [:access_token]
59-
end
52+
attr_required :access_token
53+
attr_accessor :expires_in, :refresh_token, :scope
6054

6155
def finish
6256
params = {

lib/rack/oauth2/server/token/assertion.rb

+1-5
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,14 @@ def call(env)
1111
end
1212

1313
class Request < Token::Request
14-
attr_accessor :assertion_type, :assertion
14+
attr_required :assertion_type, :assertion
1515

1616
def initialize(env)
1717
super
1818
@grant_type = 'assertion'
1919
@assertion_type = params['assertion_type']
2020
@assertion = params['assertion']
2121
end
22-
23-
def required_params
24-
super + [:assertion_type, :assertion]
25-
end
2622
end
2723

2824
end

lib/rack/oauth2/server/token/authorization_code.rb

+1-5
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,13 @@ def call(env)
1111
end
1212

1313
class Request < Token::Request
14-
attr_accessor :code
14+
attr_required :code
1515

1616
def initialize(env)
1717
super
1818
@grant_type = :authorization_code
1919
@code = params['code']
2020
end
21-
22-
def required_params
23-
super + [:code]
24-
end
2521
end
2622

2723
end

lib/rack/oauth2/server/token/password.rb

+1-5
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,14 @@ def call(env)
1111
end
1212

1313
class Request < Token::Request
14-
attr_reader :username, :password
14+
attr_required :username, :password
1515

1616
def initialize(env)
1717
super
1818
@grant_type = :password
1919
@username = params['username']
2020
@password = params['password']
2121
end
22-
23-
def required_params
24-
super + [:username, :password]
25-
end
2622
end
2723

2824
end

lib/rack/oauth2/server/token/refresh_token.rb

+1-5
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,13 @@ def call(env)
1111
end
1212

1313
class Request < Token::Request
14-
attr_reader :refresh_token
14+
attr_required :refresh_token
1515

1616
def initialize(env)
1717
super
1818
@grant_type = 'refresh_token'
1919
@refresh_token = params['refresh_token']
2020
end
21-
22-
def required_params
23-
super + [:refresh_token]
24-
end
2521
end
2622

2723
end

0 commit comments

Comments
 (0)