rack-oauth2 1.12.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +3 -0
  3. data/.github/workflows/spec.yml +32 -0
  4. data/CHANGELOG.md +25 -0
  5. data/README.rdoc +1 -26
  6. data/VERSION +1 -1
  7. data/lib/rack/oauth2/access_token/authenticator.rb +1 -10
  8. data/lib/rack/oauth2/access_token/bearer.rb +1 -1
  9. data/lib/rack/oauth2/access_token/mtls.rb +2 -2
  10. data/lib/rack/oauth2/access_token.rb +4 -6
  11. data/lib/rack/oauth2/client.rb +97 -41
  12. data/lib/rack/oauth2/server/abstract/error.rb +2 -1
  13. data/lib/rack/oauth2/server/extension/pkce.rb +1 -1
  14. data/lib/rack/oauth2/server/rails/response_ext.rb +5 -5
  15. data/lib/rack/oauth2/server/resource/error.rb +4 -4
  16. data/lib/rack/oauth2/server/resource.rb +0 -1
  17. data/lib/rack/oauth2/server/token/error.rb +3 -1
  18. data/lib/rack/oauth2/server/token.rb +16 -5
  19. data/lib/rack/oauth2/urn.rb +3 -3
  20. data/lib/rack/oauth2/util.rb +6 -2
  21. data/lib/rack/oauth2.rb +11 -10
  22. data/rack-oauth2.gemspec +7 -5
  23. data/spec/helpers/webmock_helper.rb +8 -2
  24. data/spec/rack/oauth2/access_token/authenticator_spec.rb +2 -22
  25. data/spec/rack/oauth2/access_token/bearer_spec.rb +2 -2
  26. data/spec/rack/oauth2/access_token_spec.rb +0 -17
  27. data/spec/rack/oauth2/client_spec.rb +173 -75
  28. data/spec/rack/oauth2/oauth2_spec.rb +0 -43
  29. data/spec/rack/oauth2/server/authorize/error_spec.rb +6 -6
  30. data/spec/rack/oauth2/server/resource/bearer/error_spec.rb +2 -2
  31. data/spec/rack/oauth2/server/resource/bearer_spec.rb +9 -9
  32. data/spec/rack/oauth2/server/resource/error_spec.rb +21 -21
  33. data/spec/rack/oauth2/server/token/authorization_code_spec.rb +2 -2
  34. data/spec/rack/oauth2/server/token/client_credentials_spec.rb +32 -2
  35. data/spec/rack/oauth2/server/token/error_spec.rb +8 -8
  36. data/spec/rack/oauth2/server/token_spec.rb +72 -3
  37. data/spec/rack/oauth2/util_spec.rb +8 -3
  38. metadata +47 -51
  39. data/.travis.yml +0 -7
  40. data/lib/rack/oauth2/access_token/legacy.rb +0 -19
  41. data/lib/rack/oauth2/access_token/mac/sha256_hex_verifier.rb +0 -17
  42. data/lib/rack/oauth2/access_token/mac/signature.rb +0 -34
  43. data/lib/rack/oauth2/access_token/mac/verifier.rb +0 -44
  44. data/lib/rack/oauth2/access_token/mac.rb +0 -103
  45. data/lib/rack/oauth2/debugger/request_filter.rb +0 -30
  46. data/lib/rack/oauth2/debugger.rb +0 -3
  47. data/lib/rack/oauth2/server/resource/mac/error.rb +0 -24
  48. data/lib/rack/oauth2/server/resource/mac.rb +0 -36
  49. data/spec/mock_response/tokens/legacy.json +0 -5
  50. data/spec/mock_response/tokens/legacy.txt +0 -1
  51. data/spec/mock_response/tokens/legacy_without_expires_in.txt +0 -1
  52. data/spec/mock_response/tokens/mac.json +0 -8
  53. data/spec/rack/oauth2/access_token/legacy_spec.rb +0 -23
  54. data/spec/rack/oauth2/access_token/mac/sha256_hex_verifier_spec.rb +0 -28
  55. data/spec/rack/oauth2/access_token/mac/signature_spec.rb +0 -59
  56. data/spec/rack/oauth2/access_token/mac/verifier_spec.rb +0 -25
  57. data/spec/rack/oauth2/access_token/mac_spec.rb +0 -141
  58. data/spec/rack/oauth2/debugger/request_filter_spec.rb +0 -33
  59. data/spec/rack/oauth2/server/resource/mac/error_spec.rb +0 -52
  60. data/spec/rack/oauth2/server/resource/mac_spec.rb +0 -119
  61. /data/spec/mock_response/{blank → blank.txt} +0 -0
@@ -1,34 +0,0 @@
1
- module Rack
2
- module OAuth2
3
- class AccessToken
4
- class MAC
5
- class Signature < Verifier
6
- attr_required :secret, :ts, :nonce, :method, :request_uri, :host, :port
7
- attr_optional :ext, :query
8
-
9
- def calculate
10
- Rack::OAuth2::Util.base64_encode OpenSSL::HMAC.digest(
11
- hash_generator,
12
- secret,
13
- normalized_request_string
14
- )
15
- end
16
-
17
- def normalized_request_string
18
- [
19
- ts.to_i,
20
- nonce,
21
- method.to_s.upcase,
22
- request_uri,
23
- host,
24
- port,
25
- ext || '',
26
- nil
27
- ].join("\n")
28
- end
29
-
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,44 +0,0 @@
1
- module Rack
2
- module OAuth2
3
- class AccessToken
4
- class MAC
5
- class Verifier
6
- include AttrRequired, AttrOptional
7
- attr_required :algorithm
8
-
9
- class VerificationFailed < StandardError; end
10
-
11
- def initialize(attributes = {})
12
- (required_attributes + optional_attributes).each do |key|
13
- self.send :"#{key}=", attributes[key]
14
- end
15
- attr_missing!
16
- rescue AttrRequired::AttrMissing => e
17
- raise VerificationFailed.new("#{self.class.name.demodulize} Invalid: #{e.message}")
18
- end
19
-
20
- def verify!(expected)
21
- if expected == self.calculate
22
- :verified
23
- else
24
- raise VerificationFailed.new("#{self.class.name.demodulize} Invalid")
25
- end
26
- end
27
-
28
- private
29
-
30
- def hash_generator
31
- case algorithm.to_s
32
- when 'hmac-sha-1'
33
- OpenSSL::Digest::SHA1.new
34
- when 'hmac-sha-256'
35
- OpenSSL::Digest::SHA256.new
36
- else
37
- raise 'Unsupported Algorithm'
38
- end
39
- end
40
- end
41
- end
42
- end
43
- end
44
- end
@@ -1,103 +0,0 @@
1
- module Rack
2
- module OAuth2
3
- class AccessToken
4
- class MAC < AccessToken
5
- attr_required :mac_key, :mac_algorithm
6
- attr_optional :ts, :ext_verifier, :ts_expires_in
7
- attr_reader :nonce, :signature, :ext
8
-
9
- def initialize(attributes = {})
10
- super(attributes)
11
- @issued_at = Time.now.utc
12
- @ts_expires_in ||= 5.minutes
13
- end
14
-
15
- def token_response
16
- super.merge(
17
- mac_key: mac_key,
18
- mac_algorithm: mac_algorithm
19
- )
20
- end
21
-
22
- def verify!(request)
23
- if self.ext_verifier.present?
24
- body = request.body.read
25
- request.body.rewind # for future use
26
-
27
- self.ext_verifier.new(
28
- raw_body: body,
29
- algorithm: self.mac_algorithm
30
- ).verify!(request.ext)
31
- end
32
-
33
- now = Time.now.utc.to_i
34
- now = @ts.to_i if @ts.present?
35
-
36
- raise Rack::OAuth2::AccessToken::MAC::Verifier::VerificationFailed.new("Request ts expired") if now - request.ts.to_i > @ts_expires_in.to_i
37
-
38
- Signature.new(
39
- secret: self.mac_key,
40
- algorithm: self.mac_algorithm,
41
- nonce: request.nonce,
42
- method: request.request_method,
43
- request_uri: request.fullpath,
44
- host: request.host,
45
- port: request.port,
46
- ts: request.ts,
47
- ext: request.ext
48
- ).verify!(request.signature)
49
- rescue Verifier::VerificationFailed => e
50
- request.invalid_token! e.message
51
- end
52
-
53
- def authenticate(request)
54
- @nonce = generate_nonce
55
- @ts_generated = @ts || Time.now.utc
56
-
57
- if self.ext_verifier.present?
58
- @ext = self.ext_verifier.new(
59
- raw_body: request.body,
60
- algorithm: self.mac_algorithm
61
- ).calculate
62
- end
63
-
64
- @signature = Signature.new(
65
- secret: self.mac_key,
66
- algorithm: self.mac_algorithm,
67
- nonce: self.nonce,
68
- method: request.header.request_method,
69
- request_uri: request.header.create_query_uri,
70
- host: request.header.request_uri.host,
71
- port: request.header.request_uri.port,
72
- ts: @ts_generated,
73
- ext: @ext
74
- ).calculate
75
-
76
- request.header['Authorization'] = authorization_header
77
- end
78
-
79
- private
80
-
81
- def authorization_header
82
- header = "MAC id=\"#{access_token}\""
83
- header << ", nonce=\"#{nonce}\""
84
- header << ", ts=\"#{@ts_generated.to_i}\""
85
- header << ", mac=\"#{signature}\""
86
- header << ", ext=\"#{ext}\"" if @ext.present?
87
- header
88
- end
89
-
90
- def generate_nonce
91
- [
92
- (Time.now.utc - @issued_at).to_i,
93
- SecureRandom.hex
94
- ].join(':')
95
- end
96
- end
97
- end
98
- end
99
- end
100
-
101
- require 'rack/oauth2/access_token/mac/verifier'
102
- require 'rack/oauth2/access_token/mac/sha256_hex_verifier'
103
- require 'rack/oauth2/access_token/mac/signature'
@@ -1,30 +0,0 @@
1
- module Rack
2
- module OAuth2
3
- module Debugger
4
- class RequestFilter
5
- # Callback called in HTTPClient (before sending a request)
6
- # request:: HTTP::Message
7
- def filter_request(request)
8
- started = "======= [Rack::OAuth2] HTTP REQUEST STARTED ======="
9
- log started, request.dump
10
- end
11
-
12
- # Callback called in HTTPClient (after received a response)
13
- # request:: HTTP::Message
14
- # response:: HTTP::Message
15
- def filter_response(request, response)
16
- finished = "======= [Rack::OAuth2] HTTP REQUEST FINISHED ======="
17
- log '-' * 50, response.dump, finished
18
- end
19
-
20
- private
21
-
22
- def log(*outputs)
23
- outputs.each do |output|
24
- OAuth2.logger.info output
25
- end
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,3 +0,0 @@
1
- Dir[File.dirname(__FILE__) + '/debugger/*.rb'].each do |file|
2
- require file
3
- end
@@ -1,24 +0,0 @@
1
- module Rack
2
- module OAuth2
3
- module Server
4
- class Resource
5
- class MAC
6
- class Unauthorized < Resource::Unauthorized
7
- def scheme
8
- :MAC
9
- end
10
- end
11
-
12
- module ErrorMethods
13
- include Resource::ErrorMethods
14
- def unauthorized!(error = nil, description = nil, options = {})
15
- raise Unauthorized.new(error, description, options)
16
- end
17
- end
18
-
19
- Request.send :include, ErrorMethods
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,36 +0,0 @@
1
- module Rack
2
- module OAuth2
3
- module Server
4
- class Resource
5
- class MAC < Resource
6
- def _call(env)
7
- self.request = Request.new(env)
8
- super
9
- end
10
-
11
- private
12
-
13
- class Request < Resource::Request
14
- attr_reader :nonce, :ts, :ext, :signature
15
-
16
- def setup!
17
- auth_params = Rack::Auth::Digest::Params.parse(@auth_header.params).with_indifferent_access
18
- @access_token = auth_params[:id]
19
- @nonce = auth_params[:nonce]
20
- @ts = auth_params[:ts]
21
- @ext = auth_params[:ext]
22
- @signature = auth_params[:mac]
23
- self
24
- end
25
-
26
- def oauth2?
27
- @auth_header.provided? && @auth_header.scheme.to_s == 'mac'
28
- end
29
- end
30
- end
31
- end
32
- end
33
- end
34
- end
35
-
36
- require 'rack/oauth2/server/resource/mac/error'
@@ -1,5 +0,0 @@
1
- {
2
- "access_token":"access_token",
3
- "refresh_token":"refresh_token",
4
- "expires_in":3600
5
- }
@@ -1 +0,0 @@
1
- access_token=access_token&expires=3600
@@ -1 +0,0 @@
1
- access_token=access_token
@@ -1,8 +0,0 @@
1
- {
2
- "token_type":"mac",
3
- "mac_algorithm":"hmac-sha-256",
4
- "expires_in":3600,
5
- "mac_key":"secret",
6
- "refresh_token":"refresh_token",
7
- "access_token":"access_token"
8
- }
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Rack::OAuth2::AccessToken::Legacy do
4
- let :token do
5
- Rack::OAuth2::AccessToken::Legacy.new(
6
- access_token: 'access_token'
7
- )
8
- end
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"}, {}) }
11
-
12
- describe '#to_s' do
13
- subject { token }
14
- its(:to_s) { should == token.access_token }
15
- end
16
-
17
- describe '.authenticate' do
18
- it 'should set Authorization header' do
19
- expect(request.header).to receive(:[]=).with('Authorization', 'OAuth access_token')
20
- token.authenticate(request)
21
- end
22
- end
23
- end
@@ -1,28 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Rack::OAuth2::AccessToken::MAC::Sha256HexVerifier do
4
-
5
- # From the example of webtopay wallet API spec
6
- # ref) https://www.webtopay.com/wallet/#authentication
7
- context 'when example from webtopay wallet API' do
8
- subject do
9
- Rack::OAuth2::AccessToken::MAC::Sha256HexVerifier.new(
10
- algorithm: 'hmac-sha-256',
11
- raw_body: 'grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=http%3A%2F%2Flocalhost%2Fabc'
12
- )
13
- end
14
- its(:calculate) { should == '21fb73c40b589622d0c78e9cd8900f89d9472aa724d0e5c3eca9ac1cd9d2a6d5' }
15
- end
16
-
17
-
18
- context 'when raw_body is empty' do
19
- subject do
20
- Rack::OAuth2::AccessToken::MAC::Sha256HexVerifier.new(
21
- algorithm: 'hmac-sha-256',
22
- raw_body: ''
23
- )
24
- end
25
- its(:calculate) { should be_nil }
26
- end
27
-
28
- end
@@ -1,59 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Rack::OAuth2::AccessToken::MAC::Signature do
4
- # From the example of Webtopay wallet API
5
- # ref) https://www.webtopay.com/wallet/
6
- context 'when ext is not given' do
7
- subject do
8
- Rack::OAuth2::AccessToken::MAC::Signature.new(
9
- secret: 'IrdTc8uQodU7PRpLzzLTW6wqZAO6tAMU',
10
- algorithm: 'hmac-sha-256',
11
- nonce: 'dj83hs9s',
12
- ts: 1336363200,
13
- method: 'GET',
14
- request_uri: '/wallet/rest/api/v1/payment/123',
15
- host: 'www.webtopay.com',
16
- port: 443
17
- )
18
- end
19
- its(:calculate) { should == 'OZE9fTk2qiRtL1jb01L8lRxC66PTiAGhMDEmboeVeLs=' }
20
- end
21
-
22
- # From the example of MAC spec section 1.1
23
- # ref) http://tools.ietf.org/pdf/draft-ietf-oauth-v2-http-mac-01.pdf
24
- context 'when ext is not given' do
25
- subject do
26
- Rack::OAuth2::AccessToken::MAC::Signature.new(
27
- secret: '489dks293j39',
28
- algorithm: 'hmac-sha-1',
29
- nonce: 'dj83hs9s',
30
- ts: 1336363200,
31
- method: 'GET',
32
- request_uri: '/resource/1?b=1&a=2',
33
- host: 'example.com',
34
- port: 80
35
- )
36
- end
37
- its(:calculate) { should == '6T3zZzy2Emppni6bzL7kdRxUWL4=' }
38
- end
39
-
40
- # From the example of MAC spec section 3.2
41
- # ref) http://tools.ietf.org/pdf/draft-ietf-oauth-v2-http-mac-01.pdf
42
- context 'otherwise' do
43
- subject do
44
- Rack::OAuth2::AccessToken::MAC::Signature.new(
45
- secret: '489dks293j39',
46
- algorithm: 'hmac-sha-1',
47
- nonce: '7d8f3e4a',
48
- ts: 264095,
49
- method: 'POST',
50
- request_uri: '/request?b5=%3D%253D&a3=a&c%40=&a2=r%20b&c2&a3=2+q',
51
- host: 'example.com',
52
- port: 80,
53
- ext: 'a,b,c'
54
- )
55
- end
56
- its(:calculate) { should == '+txL5oOFHGYjrfdNYH5VEzROaBY=' }
57
- end
58
-
59
- end
@@ -1,25 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Rack::OAuth2::AccessToken::MAC::Verifier do
4
- let(:verifier) { Rack::OAuth2::AccessToken::MAC::Verifier.new(algorithm: algorithm) }
5
- subject { verifier }
6
-
7
- context 'when "hmac-sha-1" is specified' do
8
- let(:algorithm) { 'hmac-sha-1' }
9
- its(:hash_generator) { should be_instance_of OpenSSL::Digest::SHA1 }
10
- end
11
-
12
- context 'when "hmac-sha-256" is specified' do
13
- let(:algorithm) { 'hmac-sha-256' }
14
- its(:hash_generator) { should be_instance_of OpenSSL::Digest::SHA256 }
15
- end
16
-
17
- context 'otherwise' do
18
- let(:algorithm) { 'invalid' }
19
- it do
20
- expect { verifier.send(:hash_generator) }.to raise_error(StandardError, 'Unsupported Algorithm')
21
- end
22
- end
23
-
24
-
25
- end
@@ -1,141 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Rack::OAuth2::AccessToken::MAC do
4
- let(:ts) { 1305820234 }
5
- let :token do
6
- Rack::OAuth2::AccessToken::MAC.new(
7
- access_token: 'access_token',
8
- mac_key: 'secret',
9
- mac_algorithm: 'hmac-sha-256',
10
- ts: ts
11
- )
12
- end
13
- let :token_with_ext_verifier do
14
- Rack::OAuth2::AccessToken::MAC.new(
15
- access_token: 'access_token',
16
- mac_key: 'secret',
17
- mac_algorithm: 'hmac-sha-256',
18
- ts: ts,
19
- ext_verifier: Rack::OAuth2::AccessToken::MAC::Sha256HexVerifier
20
- )
21
- end
22
- let(:nonce) { '1000:51e74de734c05613f37520872e68db5f' }
23
- let(:resource_endpoint) { 'https://server.example.com/resources/fake' }
24
- subject { token }
25
-
26
- its(:mac_key) { should == 'secret' }
27
- its(:mac_algorithm) { should == 'hmac-sha-256' }
28
- its(:token_response) do
29
- should == {
30
- access_token: 'access_token',
31
- refresh_token: nil,
32
- token_type: :mac,
33
- expires_in: nil,
34
- scope: '',
35
- mac_key: 'secret',
36
- mac_algorithm: 'hmac-sha-256'
37
- }
38
- end
39
- its(:generate_nonce) { should be_a String }
40
-
41
- describe 'verify!' do
42
- let(:request) { Rack::OAuth2::Server::Resource::MAC::Request.new(env) }
43
-
44
- context 'when no ext_verifier is given' do
45
- let(:env) do
46
- Rack::MockRequest.env_for(
47
- '/protected_resources',
48
- 'HTTP_AUTHORIZATION' => %{MAC id="access_token", nonce="#{nonce}", ts="#{ts}" mac="#{signature}"}
49
- )
50
- end
51
-
52
- context 'when signature is valid' do
53
- let(:signature) { 'BgooS/voPOZWLwoVfx4+zbC3xAVKW3jtjhKYOfIGZOA=' }
54
- it do
55
-
56
- token.verify!(request.setup!).should == :verified
57
- end
58
- end
59
-
60
- context 'otherwise' do
61
- let(:signature) { 'invalid' }
62
- it do
63
- expect { token.verify!(request.setup!) }.to raise_error(
64
- Rack::OAuth2::Server::Resource::MAC::Unauthorized,
65
- 'invalid_token :: Signature Invalid'
66
- )
67
- end
68
- end
69
- end
70
-
71
- context 'when ext_verifier is given' do
72
- let(:env) do
73
- Rack::MockRequest.env_for(
74
- '/protected_resources',
75
- method: :POST,
76
- params: {
77
- key1: 'value1'
78
- },
79
- 'HTTP_AUTHORIZATION' => %{MAC id="access_token", nonce="#{nonce}", ts="#{ts}", mac="#{signature}", ext="#{ext}"}
80
- )
81
- end
82
- let(:signature) { 'invalid' }
83
-
84
- context 'when ext is invalid' do
85
- let(:ext) { 'invalid' }
86
- it do
87
- expect { token_with_ext_verifier.verify!(request.setup!) }.to raise_error(
88
- Rack::OAuth2::Server::Resource::MAC::Unauthorized,
89
- 'invalid_token :: Sha256HexVerifier Invalid'
90
- )
91
- end
92
- end
93
-
94
- context 'when ext is valid' do
95
- let(:ext) { '4cfcd46c59f54b5ea6a5f9b05c28b52fef2864747194b5fdfc3d59c0057bf35a' }
96
-
97
- context 'when signature is valid' do
98
- let(:signature) { 'dZYR54n+Lym5qCRRmDqmRZ71rG+bkjSWmqrOv8OjYHk=' }
99
- it do
100
- Time.fix(Time.at(1302361200)) do
101
- token_with_ext_verifier.verify!(request.setup!).should == :verified
102
- end
103
- end
104
- end
105
-
106
- context 'otherwise' do
107
- it do
108
- expect { token.verify!(request.setup!) }.to raise_error(
109
- Rack::OAuth2::Server::Resource::MAC::Unauthorized,
110
- 'invalid_token :: Signature Invalid'
111
- )
112
- end
113
- end
114
- end
115
- end
116
- end
117
-
118
- describe '.authenticate' do
119
- let(:request) { HTTPClient.new.send(:create_request, :post, URI.parse(resource_endpoint), {}, {hello: "world"}, {}) }
120
- context 'when no ext_verifier is given' do
121
- let(:signature) { 'pOBaL6HRawe4tUPmcU4vJEj1f2GJqrbQOlCcdAYgI/s=' }
122
-
123
- it 'should set Authorization header' do
124
- expect(token).to receive(:generate_nonce).and_return(nonce)
125
- expect(request.header).to receive(:[]=).with('Authorization', "MAC id=\"access_token\", nonce=\"#{nonce}\", ts=\"#{ts.to_i}\", mac=\"#{signature}\"")
126
- token.authenticate(request)
127
- end
128
- end
129
-
130
- context 'when ext_verifier is given' do
131
- let(:signature) { 'vgU0fj6rSpwUCAoCOrXlu8pZBR8a5Q5xIVlB4MCvJeM=' }
132
- let(:ext) { '3d011e09502a84552a0f8ae112d024cc2c115597e3a577d5f49007902c221dc5' }
133
- it 'should set Authorization header with ext_verifier' do
134
- expect(token_with_ext_verifier).to receive(:generate_nonce).and_return(nonce)
135
- expect(request.header).to receive(:[]=).with('Authorization', "MAC id=\"access_token\", nonce=\"#{nonce}\", ts=\"#{ts.to_i}\", mac=\"#{signature}\", ext=\"#{ext}\"")
136
- token_with_ext_verifier.authenticate(request)
137
- end
138
- end
139
-
140
- end
141
- end
@@ -1,33 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Rack::OAuth2::Debugger::RequestFilter do
4
- let(:resource_endpoint) { 'https://example.com/resources' }
5
- let(:request) { HTTP::Message.new_request(:get, URI.parse(resource_endpoint)) }
6
- let(:response) { HTTP::Message.new_response({hello: 'world'}.to_json) }
7
- let(:request_filter) { Rack::OAuth2::Debugger::RequestFilter.new }
8
-
9
- describe '#filter_request' do
10
- it 'should log request' do
11
- [
12
- "======= [Rack::OAuth2] HTTP REQUEST STARTED =======",
13
- request.dump
14
- ].each do |output|
15
- expect(Rack::OAuth2.logger).to receive(:info).with output
16
- end
17
- request_filter.filter_request(request)
18
- end
19
- end
20
-
21
- describe '#filter_response' do
22
- it 'should log response' do
23
- [
24
- "--------------------------------------------------",
25
- response.dump,
26
- "======= [Rack::OAuth2] HTTP REQUEST FINISHED ======="
27
- ].each do |output|
28
- expect(Rack::OAuth2.logger).to receive(:info).with output
29
- end
30
- request_filter.filter_response(request, response)
31
- end
32
- end
33
- end
@@ -1,52 +0,0 @@
1
- require 'spec_helper.rb'
2
-
3
- describe Rack::OAuth2::Server::Resource::MAC::Unauthorized do
4
- let(:error) { Rack::OAuth2::Server::Resource::MAC::Unauthorized.new(:invalid_token) }
5
-
6
- it { should be_a Rack::OAuth2::Server::Resource::Unauthorized }
7
-
8
- describe '#scheme' do
9
- subject { error }
10
- its(:scheme) { should == :MAC }
11
- end
12
-
13
- describe '#finish' do
14
- it 'should use MAC scheme' do
15
- status, header, response = error.finish
16
- header['WWW-Authenticate'].should =~ /^MAC /
17
- end
18
- end
19
- end
20
-
21
- describe Rack::OAuth2::Server::Resource::MAC::ErrorMethods do
22
- let(:unauthorized) { Rack::OAuth2::Server::Resource::MAC::Unauthorized }
23
- let(:redirect_uri) { 'http://client.example.com/callback' }
24
- let(:default_description) { Rack::OAuth2::Server::Resource::ErrorMethods::DEFAULT_DESCRIPTION }
25
- let(:env) { Rack::MockRequest.env_for("/authorize?client_id=client_id") }
26
- let(:request) { Rack::OAuth2::Server::Resource::MAC::Request.new env }
27
-
28
- describe 'unauthorized!' do
29
- it do
30
- expect { request.unauthorized! :invalid_client }.to raise_error unauthorized
31
- end
32
- end
33
-
34
- Rack::OAuth2::Server::Resource::Bearer::ErrorMethods::DEFAULT_DESCRIPTION.keys.each do |error_code|
35
- method = "#{error_code}!"
36
- case error_code
37
- when :invalid_request
38
- # ignore
39
- when :insufficient_scope
40
- # ignore
41
- else
42
- describe method do
43
- it "should raise Rack::OAuth2::Server::Resource::Bearer::Unauthorized with error = :#{error_code}" do
44
- expect { request.send method }.to raise_error(unauthorized) { |error|
45
- error.error.should == error_code
46
- error.description.should == default_description[error_code]
47
- }
48
- end
49
- end
50
- end
51
- end
52
- end