openid_connect 1.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +5 -5
  2. data/.github/FUNDING.yml +3 -0
  3. data/.github/workflows/spec.yml +32 -0
  4. data/CHANGELOG.md +17 -0
  5. data/README.rdoc +0 -2
  6. data/VERSION +1 -1
  7. data/lib/openid_connect/access_token/mtls.rb +9 -0
  8. data/lib/openid_connect/access_token.rb +11 -2
  9. data/lib/openid_connect/client/registrar.rb +5 -5
  10. data/lib/openid_connect/client.rb +4 -5
  11. data/lib/openid_connect/discovery/provider/config/resource.rb +4 -2
  12. data/lib/openid_connect/discovery/provider/config/response.rb +21 -12
  13. data/lib/openid_connect/request_object.rb +3 -1
  14. data/lib/openid_connect/response_object/id_token.rb +28 -13
  15. data/lib/openid_connect/response_object/user_info.rb +1 -0
  16. data/lib/openid_connect.rb +22 -8
  17. data/openid_connect.gemspec +14 -6
  18. data/spec/helpers/webmock_helper.rb +7 -1
  19. data/spec/mock_response/access_token/without_token_type.json +3 -0
  20. data/spec/mock_response/errors/unknown.json +3 -1
  21. data/spec/mock_response/public_keys/jwks_with_private_key.json +8 -0
  22. data/spec/mock_response/public_keys/private_key.pem +27 -0
  23. data/spec/openid_connect/client/registrar_spec.rb +1 -1
  24. data/spec/openid_connect/client_spec.rb +10 -11
  25. data/spec/openid_connect/discovery/provider/config/response_spec.rb +23 -1
  26. data/spec/openid_connect/discovery/provider/config_spec.rb +28 -8
  27. data/spec/openid_connect/response_object/id_token_spec.rb +63 -11
  28. data/spec/openid_connect_spec.rb +2 -2
  29. metadata +82 -36
  30. data/.travis.yml +0 -7
  31. data/lib/openid_connect/debugger/request_filter.rb +0 -28
  32. data/lib/openid_connect/debugger.rb +0 -3
  33. data/spec/openid_connect/debugger/request_filter_spec.rb +0 -33
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: e62bda117ed864fde39524c98562d65c1255187e
4
- data.tar.gz: 7929b0e8bc8f349b2f66ffc385a821b03dca0976
2
+ SHA256:
3
+ metadata.gz: 2b5a083aca9fb04e50e7ff4fb18d26d221daac9bf22ec1cfcc136007160a03db
4
+ data.tar.gz: 1eb0f4f04691552f0b276d284bb91f47d393c0afdc8e7473c57446c4e89c6cc1
5
5
  SHA512:
6
- metadata.gz: db9854c96d10c7343b6d1a10afe7b840ed7398e2644b7b493ccad9610bc2b4078fff375f4ecd1d465637b70827ac852a866a4a3708f4fc1ea4f639554cfdb1fa
7
- data.tar.gz: a6a304fabefc2548fd9db7d98ab9b01bdf28c9735f5070c19073eaba32a1c5b346d5908d9493f193473c617ba7a6ff3e246ade91668573860256d0227d88ba7e
6
+ metadata.gz: 3469b7247c8337d0f3bc5adddc3ebc117676814fba726ba95d59fb50279ae7f8a91e3856962ab794e44bc3d8a0ccbb9adf07966bc4ff50139c74e08c783e5e1f
7
+ data.tar.gz: 5670dcd68a4b196ebb167c2eb313360d407ae30a77914da20f376f4cddef1b009642fc5aeee5eddbd971b03e7baee939076a7ed343a9e63906e309b261bda8be
@@ -0,0 +1,3 @@
1
+ # These are supported funding model platforms
2
+
3
+ github: nov
@@ -0,0 +1,32 @@
1
+ name: Spec
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ spec:
14
+ strategy:
15
+ matrix:
16
+ os: ['ubuntu-20.04']
17
+ ruby-version: ['2.6', '2.7', '3.0', '3.1']
18
+ # ubuntu 22.04 only supports ssl 3 and thus only ruby 3.1
19
+ include:
20
+ - os: 'ubuntu-22.04'
21
+ ruby-version: '3.1'
22
+ runs-on: ${{ matrix.os }}
23
+
24
+ steps:
25
+ - uses: actions/checkout@v3
26
+ - name: Set up Ruby
27
+ uses: ruby/setup-ruby@v1
28
+ with:
29
+ ruby-version: ${{ matrix.ruby-version }}
30
+ bundler-cache: true
31
+ - name: Run Specs
32
+ run: bundle exec rake spec
data/CHANGELOG.md ADDED
@@ -0,0 +1,17 @@
1
+ ## [Unreleased]
2
+
3
+ ## [2.1.0] - 2022-10-10
4
+
5
+ ### Changed
6
+
7
+ - mTLS access token by @nov in https://github.com/nov/openid_connect/pull/76
8
+
9
+ ## [2.0.0] - 2022-10-09
10
+
11
+ ### Added
12
+
13
+ - start recording CHANGELOG
14
+
15
+ ### Changed
16
+
17
+ - replace httpclient with faraday v2 by @nov in https://github.com/nov/openid_connect/pull/75
data/README.rdoc CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  OpenID Connect Server & Client Library
4
4
 
5
- {<img src="https://secure.travis-ci.org/nov/openid_connect.png" />}[http://travis-ci.org/nov/openid_connect]
6
-
7
5
  == Installation
8
6
 
9
7
  gem install openid_connect
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0
1
+ 2.2.0
@@ -0,0 +1,9 @@
1
+ module OpenIDConnect
2
+ class AccessToken::MTLS < AccessToken
3
+ def initialize(attributes = {})
4
+ super
5
+ http_client.ssl.client_key = attributes[:private_key] || client.private_key
6
+ http_client.ssl.client_cert = attributes[:certificate] || client.certificate
7
+ end
8
+ end
9
+ end
@@ -15,13 +15,20 @@ module OpenIDConnect
15
15
  ResponseObject::UserInfo.new hash
16
16
  end
17
17
 
18
+ def to_mtls(attributes = {})
19
+ (required_attributes + optional_attributes).each do |key|
20
+ attributes[key] = self.send(key)
21
+ end
22
+ MTLS.new attributes
23
+ end
24
+
18
25
  private
19
26
 
20
27
  def resource_request
21
28
  res = yield
22
29
  case res.status
23
30
  when 200
24
- JSON.parse(res.body).with_indifferent_access
31
+ res.body.with_indifferent_access
25
32
  when 400
26
33
  raise BadRequest.new('API Access Faild', res)
27
34
  when 401
@@ -33,4 +40,6 @@ module OpenIDConnect
33
40
  end
34
41
  end
35
42
  end
36
- end
43
+ end
44
+
45
+ require 'openid_connect/access_token/mtls'
@@ -50,12 +50,12 @@ module OpenIDConnect
50
50
  ]
51
51
  attr_required :endpoint
52
52
  attr_optional :initial_access_token
53
- attr_required *required_metadata_attributes
54
- attr_optional *(metadata_attributes - required_metadata_attributes)
53
+ attr_required(*required_metadata_attributes)
54
+ attr_optional(*(metadata_attributes - required_metadata_attributes))
55
55
 
56
- validates *required_attributes, presence: true
56
+ validates(*required_attributes, presence: true)
57
57
  validates :sector_identifier_uri, presence: {if: :sector_identifier_required?}
58
- validates *singular_uri_attributes, url: true, allow_nil: true
58
+ validates(*singular_uri_attributes, url: true, allow_nil: true)
59
59
  validate :validate_plural_uri_attributes
60
60
  validate :validate_contacts
61
61
 
@@ -170,7 +170,7 @@ module OpenIDConnect
170
170
  end
171
171
 
172
172
  def handle_success_response(response)
173
- credentials = JSON.parse(response.body).with_indifferent_access
173
+ credentials = response.body.with_indifferent_access
174
174
  Client.new(
175
175
  identifier: credentials[:client_id],
176
176
  secret: credentials[:client_secret],
@@ -26,19 +26,18 @@ module OpenIDConnect
26
26
  end
27
27
 
28
28
  def handle_success_response(response)
29
- token_hash = JSON.parse(response.body).with_indifferent_access
30
- case token_type = token_hash[:token_type].try(:downcase)
29
+ token_hash = response.body.with_indifferent_access
30
+ token_type = (@forced_token_type || token_hash[:token_type]).try(:downcase)
31
+ case token_type
31
32
  when 'bearer'
32
33
  AccessToken.new token_hash.merge(client: self)
33
34
  else
34
35
  raise Exception.new("Unexpected Token Type: #{token_type}")
35
36
  end
36
- rescue JSON::ParserError
37
- raise Exception.new("Unknown Token Type")
38
37
  end
39
38
  end
40
39
  end
41
40
 
42
41
  Dir[File.dirname(__FILE__) + '/client/*.rb'].each do |file|
43
42
  require file
44
- end
43
+ end
@@ -1,3 +1,5 @@
1
+ require "openssl"
2
+
1
3
  module OpenIDConnect
2
4
  module Discovery
3
5
  module Provider
@@ -27,8 +29,8 @@ module OpenIDConnect
27
29
  end
28
30
 
29
31
  def cache_key
30
- md5 = Digest::MD5.hexdigest host
31
- "swd:resource:opneid-conf:#{md5}"
32
+ sha256 = OpenSSL::Digest::SHA256.hexdigest host
33
+ "swd:resource:opneid-conf:#{sha256}"
32
34
  end
33
35
  end
34
36
  end
@@ -18,17 +18,19 @@ module OpenIDConnect
18
18
  :token_endpoint,
19
19
  :userinfo_endpoint,
20
20
  :registration_endpoint,
21
+ :end_session_endpoint,
21
22
  :service_documentation,
23
+ :check_session_iframe,
22
24
  :op_policy_uri,
23
25
  :op_tos_uri
24
26
  ]
25
27
  }
26
- attr_required *(uri_attributes[:required] + [
28
+ attr_required(*(uri_attributes[:required] + [
27
29
  :response_types_supported,
28
30
  :subject_types_supported,
29
31
  :id_token_signing_alg_values_supported
30
- ])
31
- attr_optional *(uri_attributes[:optional] + [
32
+ ]))
33
+ attr_optional(*(uri_attributes[:optional] + [
32
34
  :scopes_supported,
33
35
  :response_modes_supported,
34
36
  :grant_types_supported,
@@ -52,10 +54,10 @@ module OpenIDConnect
52
54
  :request_parameter_supported,
53
55
  :request_uri_parameter_supported,
54
56
  :require_request_uri_registration
55
- ])
57
+ ]))
56
58
 
57
- validates *required_attributes, presence: true
58
- validates *uri_attributes.values.flatten, url: true, allow_nil: true
59
+ validates(*required_attributes, presence: true)
60
+ validates(*uri_attributes.values.flatten, url: true, allow_nil: true)
59
61
  validates :issuer, with: :validate_issuer_matching
60
62
 
61
63
  def initialize(hash)
@@ -74,17 +76,20 @@ module OpenIDConnect
74
76
  end
75
77
  end
76
78
 
77
- def validate!(expected_issuer = nil)
79
+ def validate!
78
80
  valid? or raise ValidationFailed.new(self)
79
81
  end
80
82
 
81
83
  def jwks
82
- @jwks ||= JSON.parse(
83
- OpenIDConnect.http_client.get_content(jwks_uri)
84
- ).with_indifferent_access
84
+ @jwks ||= OpenIDConnect.http_client.get(jwks_uri).body.with_indifferent_access
85
85
  JSON::JWK::Set.new @jwks[:keys]
86
86
  end
87
87
 
88
+ def jwk(kid)
89
+ @jwks ||= {}
90
+ @jwks[kid] ||= JSON::JWK::Set::Fetcher.fetch(jwks_uri, kid: kid)
91
+ end
92
+
88
93
  def public_keys
89
94
  @public_keys ||= jwks.collect(&:to_key)
90
95
  end
@@ -93,11 +98,15 @@ module OpenIDConnect
93
98
 
94
99
  def validate_issuer_matching
95
100
  if expected_issuer.present? && issuer != expected_issuer
96
- errors.add :issuer, 'mismatch'
101
+ if OpenIDConnect.validate_discovery_issuer
102
+ errors.add :issuer, 'mismatch'
103
+ else
104
+ OpenIDConnect.logger.warn 'ignoring issuer mismach.'
105
+ end
97
106
  end
98
107
  end
99
108
  end
100
109
  end
101
110
  end
102
111
  end
103
- end
112
+ end
@@ -5,10 +5,12 @@ module OpenIDConnect
5
5
  attr_optional :client_id, :response_type, :redirect_uri, :scope, :state, :nonce, :display, :prompt, :userinfo, :id_token
6
6
  validate :require_at_least_one_attributes
7
7
 
8
+ undef :id_token=
8
9
  def id_token=(attributes = {})
9
10
  @id_token = IdToken.new(attributes) if attributes.present?
10
11
  end
11
12
 
13
+ undef :userinfo=
12
14
  def userinfo=(attributes = {})
13
15
  @userinfo = UserInfo.new(attributes) if attributes.present?
14
16
  end
@@ -23,7 +25,7 @@ module OpenIDConnect
23
25
  end
24
26
 
25
27
  def fetch(request_uri, key = nil)
26
- jwt_string = OpenIDConnect.http_client.get_content(request_uri)
28
+ jwt_string = OpenIDConnect.http_client.get(request_uri).body
27
29
  decode jwt_string, key
28
30
  end
29
31
  end
@@ -1,13 +1,15 @@
1
- require 'json/jwt'
2
-
3
1
  module OpenIDConnect
4
2
  class ResponseObject
5
3
  class IdToken < ConnectObject
6
4
  class InvalidToken < Exception; end
5
+ class ExpiredToken < InvalidToken; end
6
+ class InvalidIssuer < InvalidToken; end
7
+ class InvalidNonce < InvalidToken; end
8
+ class InvalidAudience < InvalidToken; end
7
9
 
8
10
  attr_required :iss, :sub, :aud, :exp, :iat
9
- attr_optional :acr, :auth_time, :nonce, :sub_jwk, :at_hash, :c_hash
10
- attr_accessor :access_token, :code
11
+ attr_optional :acr, :amr, :azp, :jti, :sid, :auth_time, :nonce, :sub_jwk, :at_hash, :c_hash, :s_hash
12
+ attr_accessor :access_token, :code, :state
11
13
  alias_method :subject, :sub
12
14
  alias_method :subject=, :sub=
13
15
 
@@ -20,11 +22,16 @@ module OpenIDConnect
20
22
  end
21
23
 
22
24
  def verify!(expected = {})
23
- exp.to_i > Time.now.to_i &&
24
- iss == expected[:issuer] &&
25
- Array(aud).include?(expected[:audience] || expected[:client_id]) && # aud(ience) can be a string or an array of strings
26
- nonce == expected[:nonce] or
27
- raise InvalidToken.new('Invalid ID Token')
25
+ raise ExpiredToken.new('Invalid ID token: Expired token') unless exp.to_i > Time.now.to_i
26
+ raise InvalidIssuer.new('Invalid ID token: Issuer does not match') unless iss == expected[:issuer]
27
+ raise InvalidNonce.new('Invalid ID Token: Nonce does not match') unless nonce == expected[:nonce]
28
+
29
+ # aud(ience) can be a string or an array of strings
30
+ unless Array(aud).include?(expected[:audience] || expected[:client_id])
31
+ raise InvalidAudience.new('Invalid ID token: Audience does not match')
32
+ end
33
+
34
+ true
28
35
  end
29
36
 
30
37
  include JWTnizable
@@ -42,6 +49,9 @@ module OpenIDConnect
42
49
  if code
43
50
  self.c_hash = left_half_hash_of code, hash_length
44
51
  end
52
+ if state
53
+ self.s_hash = left_half_hash_of state, hash_length
54
+ end
45
55
  super
46
56
  end
47
57
 
@@ -49,15 +59,20 @@ module OpenIDConnect
49
59
 
50
60
  def left_half_hash_of(string, hash_length)
51
61
  digest = OpenSSL::Digest.new("SHA#{hash_length}").digest string
52
- UrlSafeBase64.encode64 digest[0, hash_length / (2 * 8)]
62
+ Base64.urlsafe_encode64 digest[0, hash_length / (2 * 8)], padding: false
53
63
  end
54
64
 
55
65
  class << self
56
- def decode(jwt_string, key)
57
- if key == :self_issued
66
+ def decode(jwt_string, key_or_config)
67
+ case key_or_config
68
+ when :self_issued
58
69
  decode_self_issued jwt_string
70
+ when OpenIDConnect::Discovery::Provider::Config::Response
71
+ jwt = JSON::JWT.decode jwt_string, :skip_verification
72
+ jwt.verify! key_or_config.jwk(jwt.kid)
73
+ new jwt
59
74
  else
60
- new JSON::JWT.decode jwt_string, key
75
+ new JSON::JWT.decode jwt_string, key_or_config
61
76
  end
62
77
  end
63
78
 
@@ -47,6 +47,7 @@ module OpenIDConnect
47
47
  errors.add :address, address.errors.full_messages.join(', ') if address.present? && !address.valid?
48
48
  end
49
49
 
50
+ undef :address=
50
51
  def address=(hash_or_address)
51
52
  @address = case hash_or_address
52
53
  when Hash
@@ -1,5 +1,7 @@
1
1
  require 'json'
2
2
  require 'logger'
3
+ require 'faraday'
4
+ require 'faraday/follow_redirects'
3
5
  require 'swd'
4
6
  require 'webfinger'
5
7
  require 'active_model'
@@ -8,6 +10,7 @@ require 'validate_url'
8
10
  require 'validate_email'
9
11
  require 'attr_required'
10
12
  require 'attr_optional'
13
+ require 'json/jwt'
11
14
  require 'rack/oauth2'
12
15
  require 'rack/oauth2/server/authorize/error_with_connect_ext'
13
16
  require 'rack/oauth2/server/authorize/request_with_connect_params'
@@ -63,19 +66,31 @@ module OpenIDConnect
63
66
  self.debugging = false
64
67
 
65
68
  def self.http_client
66
- _http_client_ = HTTPClient.new(
67
- agent_name: "OpenIDConnect (#{VERSION})"
68
- )
69
- _http_client_.request_filter << Debugger::RequestFilter.new if debugging?
70
- http_config.try(:call, _http_client_)
71
- _http_client_
69
+ Faraday.new(headers: {user_agent: "OpenIDConnect (#{VERSION})"}) do |faraday|
70
+ faraday.request :url_encoded
71
+ faraday.request :json
72
+ faraday.response :json
73
+ faraday.response :logger, OpenIDConnect.logger, {bodies: true} if debugging?
74
+ faraday.adapter Faraday.default_adapter
75
+ http_config&.call(faraday)
76
+ end
72
77
  end
73
78
  def self.http_config(&block)
74
79
  @sub_protocols.each do |klass|
75
- klass.http_config &block unless klass.http_config
80
+ klass.http_config(&block) unless klass.http_config
76
81
  end
77
82
  @@http_config ||= block
78
83
  end
84
+
85
+ def self.validate_discovery_issuer=(boolean)
86
+ @@validate_discovery_issuer = boolean
87
+ end
88
+
89
+ def self.validate_discovery_issuer
90
+ @@validate_discovery_issuer
91
+ end
92
+
93
+ self.validate_discovery_issuer = true
79
94
  end
80
95
 
81
96
  require 'openid_connect/exception'
@@ -84,4 +99,3 @@ require 'openid_connect/access_token'
84
99
  require 'openid_connect/jwtnizable'
85
100
  require 'openid_connect/connect_object'
86
101
  require 'openid_connect/discovery'
87
- require 'openid_connect/debugger'
@@ -12,19 +12,27 @@ Gem::Specification.new do |s|
12
12
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
13
13
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
14
14
  s.require_paths = ["lib"]
15
- s.add_runtime_dependency "json", ">= 1.4.3"
16
15
  s.add_runtime_dependency "tzinfo"
17
16
  s.add_runtime_dependency "attr_required", ">= 1.0.0"
18
17
  s.add_runtime_dependency "activemodel"
19
18
  s.add_runtime_dependency "validate_url"
20
19
  s.add_runtime_dependency "validate_email"
21
- s.add_runtime_dependency "json-jwt", ">= 1.5.0"
22
- s.add_runtime_dependency "swd", ">= 1.0.0"
23
- s.add_runtime_dependency "webfinger", ">= 1.0.1"
24
- s.add_runtime_dependency "rack-oauth2", ">= 1.6.0"
20
+ s.add_runtime_dependency 'faraday', '~> 2.0'
21
+ s.add_runtime_dependency 'faraday-follow_redirects'
22
+ s.add_runtime_dependency "json-jwt", ">= 1.16"
23
+ s.add_runtime_dependency "swd", "~> 2.0"
24
+ s.add_runtime_dependency "webfinger", "~> 2.0"
25
+ s.add_runtime_dependency "rack-oauth2", "~> 2.2"
26
+ if Gem.ruby_version >= Gem::Version.create(3.1)
27
+ # TODO:
28
+ # remove "net-smtp" dependency after mail gem 2.8+ (which supports ruby 3.1+) released.
29
+ # ref.) https://rubygems.org/gems/mail
30
+ s.add_runtime_dependency "net-smtp"
31
+ end
25
32
  s.add_development_dependency "rake"
26
33
  s.add_development_dependency "rspec"
27
34
  s.add_development_dependency "rspec-its"
28
35
  s.add_development_dependency "webmock"
29
36
  s.add_development_dependency "simplecov"
30
- end
37
+ s.add_development_dependency "rexml"
38
+ end
@@ -32,7 +32,13 @@ module WebMockHelper
32
32
 
33
33
  def response_for(response_file, options = {})
34
34
  response = {}
35
- response[:body] = File.new(File.join(File.dirname(__FILE__), '../mock_response', "#{response_file}.#{options[:format] || :json}"))
35
+ format = options[:format] || :json
36
+ if format == :json
37
+ response[:headers] = {
38
+ 'Content-Type': 'application/json'
39
+ }
40
+ end
41
+ response[:body] = File.new(File.join(File.dirname(__FILE__), '../mock_response', "#{response_file}.#{format}"))
36
42
  if options[:status]
37
43
  response[:status] = options[:status]
38
44
  end
@@ -0,0 +1,3 @@
1
+ {
2
+ "access_token":"access_token"
3
+ }
@@ -1 +1,3 @@
1
- Fuckin Unknown Error
1
+ {
2
+ "unknown": "unknown"
3
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "keys": [{
3
+ "kty": "RSA",
4
+ "e": "AQAB",
5
+ "n": "vWr1S4T0jBnYU9PIpUYxT48Ca8HK8aitbmqbTM3t3Zzl1GNpIlyePnwXSL6SgNcVbeRhTfvXZUzH4pP8HzPJdpUHnAeYyCzjz9UNykdFCp2YW676wpLDzMkaU7bYLJxGjZlpHU-UJVIm5KX9-NfMyGbFUOuw4AY-OWp8GxrqwAF4U6bJ86TpO24wMxmgm0Vl72aRMGVJkRz66YLYOPNVjXjOI4bUuxg_o3Px5QASxvDCawMeLR3pLCoQcLAZn6WZx7nX3Wu6QzcY0QCqhqUAeY49QRT83Jdg7WUsNa2Rbegi3jJGJf-t9hEcJPmrI6q9zl6WArUueQHS-XUQWq5ptw",
6
+ "kid": "DCmKamGtkGAWz-uujePOp-UeATAeT4fi3KouR78r44I"
7
+ }]
8
+ }
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpAIBAAKCAQEAvWr1S4T0jBnYU9PIpUYxT48Ca8HK8aitbmqbTM3t3Zzl1GNp
3
+ IlyePnwXSL6SgNcVbeRhTfvXZUzH4pP8HzPJdpUHnAeYyCzjz9UNykdFCp2YW676
4
+ wpLDzMkaU7bYLJxGjZlpHU+UJVIm5KX9+NfMyGbFUOuw4AY+OWp8GxrqwAF4U6bJ
5
+ 86TpO24wMxmgm0Vl72aRMGVJkRz66YLYOPNVjXjOI4bUuxg/o3Px5QASxvDCawMe
6
+ LR3pLCoQcLAZn6WZx7nX3Wu6QzcY0QCqhqUAeY49QRT83Jdg7WUsNa2Rbegi3jJG
7
+ Jf+t9hEcJPmrI6q9zl6WArUueQHS+XUQWq5ptwIDAQABAoIBAHvDWBUJAVRNSsiy
8
+ 90XuECggk/9ed0Dg6rjblS9g2kvTyWO1tKsMAyVmpTwVsNnYLxtHfsCajcmVmoEU
9
+ Gkc06iy+AWPUnuIkWpGgbss9OAJQqI03Toc1qBO1TqtmK+cyEPNSSpkpNu4PuHPr
10
+ dX9TWW2ToNdXuJEX4y5WwlJfiwT6kPdK86IKpPCql1+X/N2nKbn+5OWHTDuW3jLF
11
+ H4UoJlUU77VgPedQLF9xr9NXGZbgYdTtsg3GU3k7/xhcetNq22Dtr8vYnX8LcIsZ
12
+ 9VW+KBRGOwgXTMLuj25VxkFUsJejEoq5+WyHTsSsa4w8Fxyc50GPfZJKh8J2jHiG
13
+ 8weJUNECgYEA5CoQmUz+8saVg1IwnEgZBSMF1rthMgvuDPhD8PJNaugUCyo9tg0O
14
+ AXo9EMOUHmr2vCN8h2MZZuuW0D5np/Z9T102N99mJU6tVMSabBPDUTfxThq4xY48
15
+ VZvS6EOzSomeEbrIDciJghqJIvPxEoqLXY3Zg7kDef7YiqybhZFdlS8CgYEA1IbH
16
+ MHKfcL+LAo88y4tgOe6Wn8FRG1K7MHvdR+KErgxBg63I9zmolPsyznjNVKpB9syt
17
+ zqkDxBg/jTIctgeziMQNSODQoqRKcgEDePwcu+wBvuV+LJFJoIWFrvIPyZ5yKzeb
18
+ Vm1lRMgQfoeAQE4nVYAJG+oTTsFTdEtrHkOW4fkCgYEAsNHcnUFrTvARDH1UiLjj
19
+ EvUKYFhEwck3CbwYwxC0aIZEikaJHp3NXd3Cl0xKbKxOXI1Pw4hMNlObQ/Uo1aUT
20
+ hb7h9rjda0omz8uxNNK4CihFjFbvHMLXBS1GbJOSzdAKvQi4Yt4nmrk/z+Omzsyp
21
+ pq34hLmL9S5H2Ghd+kwmbycCgYBiC1N1PEvl3depdJ8dX80irLj8NljOfBozQdFR
22
+ ymRfTvQiZVfjBcyJ/mDv87b2Kh2IV+CPCFXebzlSUB4CtAbVP2zJhD176sMVWPZb
23
+ KCOxZi1f/ct5kAUhcre7f5xc7SXKXjrhYlJnqsxBMw2tnOB0hz6sjA4gNPvlGK3w
24
+ JkpDMQKBgQCgPoqSjmbroWC9oq5iDwRtx6f6fJG7CE91ZFJulunQj6YWOC3zNHEa
25
+ XvPPGM8fZpJS4e8LiPClkk8nsOoC50neEVGZeEuhdP6m6WNPN3SlP7bXozHOJTh0
26
+ mHrk2bUHFlQn8f5KWfLQbdyKBzs7WqCRTOR/gIbfxBlUOs0BN37xhw==
27
+ -----END RSA PRIVATE KEY-----
@@ -253,7 +253,7 @@ describe OpenIDConnect::Client::Registrar do
253
253
  end
254
254
 
255
255
  context 'otherwise' do
256
- it { should be_instance_of HTTPClient }
256
+ it { should be_instance_of Faraday::Connection }
257
257
  end
258
258
  end
259
259
  end
@@ -162,22 +162,21 @@ describe OpenIDConnect::Client do
162
162
  end
163
163
  end
164
164
 
165
- context 'when invalid JSON is returned' do
166
- it 'should raise OpenIDConnect::Exception' do
167
- mock_json :post, client.token_endpoint, 'access_token/invalid_json', request_header: header_params, params: protocol_params do
168
- expect do
169
- access_token
170
- end.to raise_error OpenIDConnect::Exception, 'Unknown Token Type'
171
- end
172
- end
173
- end
174
-
175
165
  context 'otherwise' do
176
166
  it 'should raise Unexpected Token Type exception' do
177
167
  mock_json :post, client.token_endpoint, 'access_token/mac', request_header: header_params, params: protocol_params do
178
168
  expect { access_token }.to raise_error OpenIDConnect::Exception, 'Unexpected Token Type: mac'
179
169
  end
180
170
  end
171
+
172
+ context 'when token_type is forced' do
173
+ before { client.force_token_type! :bearer }
174
+ it 'should use forced token_type' do
175
+ mock_json :post, client.token_endpoint, 'access_token/without_token_type', request_header: header_params, params: protocol_params do
176
+ access_token.should be_a OpenIDConnect::AccessToken
177
+ end
178
+ end
179
+ end
181
180
  end
182
181
  end
183
- end
182
+ end
@@ -35,6 +35,28 @@ describe OpenIDConnect::Discovery::Provider::Config::Response do
35
35
  it { should_not be_valid }
36
36
  end
37
37
 
38
+ context 'when end_session_endpoint given' do
39
+ let(:end_session_endpoint) { 'https://server.example.com/end_session' }
40
+ let :attributes do
41
+ minimum_attributes.merge(
42
+ end_session_endpoint: end_session_endpoint
43
+ )
44
+ end
45
+ it { should be_valid }
46
+ its(:end_session_endpoint) { should == end_session_endpoint }
47
+ end
48
+
49
+ context 'when check_session_iframe given' do
50
+ let(:check_session_iframe) { 'https://server.example.com/check_session_iframe.html' }
51
+ let :attributes do
52
+ minimum_attributes.merge(
53
+ check_session_iframe: check_session_iframe
54
+ )
55
+ end
56
+ it { should be_valid }
57
+ its(:check_session_iframe) { should == check_session_iframe }
58
+ end
59
+
38
60
  describe '#as_json' do
39
61
  subject { instance.as_json }
40
62
  it { should == minimum_attributes }
@@ -81,4 +103,4 @@ describe OpenIDConnect::Discovery::Provider::Config::Response do
81
103
  public_keys.first.should be_instance_of OpenSSL::PKey::RSA
82
104
  end
83
105
  end
84
- end
106
+ end
@@ -56,13 +56,33 @@ describe OpenIDConnect::Discovery::Provider::Config do
56
56
  end
57
57
  end
58
58
 
59
- context 'when response include invalid issuer' do
60
- it do
61
- expect do
62
- mock_json :get, endpoint, 'discovery/config_with_invalid_issuer' do
63
- OpenIDConnect::Discovery::Provider::Config.discover! provider
64
- end
65
- end.to raise_error OpenIDConnect::Discovery::DiscoveryFailed
59
+ describe 'when response include invalid issuer' do
60
+ context 'with normal configuration' do
61
+ it do
62
+ expect do
63
+ mock_json :get, endpoint, 'discovery/config_with_invalid_issuer' do
64
+ OpenIDConnect::Discovery::Provider::Config.discover! provider
65
+ end
66
+ end.to raise_error OpenIDConnect::Discovery::DiscoveryFailed
67
+ end
68
+ end
69
+
70
+ context 'when issuer validation is disabled.' do
71
+ before :each do
72
+ OpenIDConnect.validate_discovery_issuer = false
73
+ end
74
+
75
+ after :each do
76
+ OpenIDConnect.validate_discovery_issuer = true
77
+ end
78
+
79
+ it do
80
+ expect do
81
+ mock_json :get, endpoint, 'discovery/config_with_invalid_issuer' do
82
+ OpenIDConnect::Discovery::Provider::Config.discover! provider
83
+ end
84
+ end.not_to raise_error
85
+ end
66
86
  end
67
87
  end
68
88
 
@@ -76,4 +96,4 @@ describe OpenIDConnect::Discovery::Provider::Config do
76
96
  end
77
97
  end
78
98
  end
79
- end
99
+ end
@@ -19,7 +19,7 @@ describe OpenIDConnect::ResponseObject::IdToken do
19
19
  describe 'attributes' do
20
20
  subject { klass }
21
21
  its(:required_attributes) { should == [:iss, :sub, :aud, :exp, :iat] }
22
- its(:optional_attributes) { should == [:acr, :auth_time, :nonce, :sub_jwk, :at_hash, :c_hash] }
22
+ its(:optional_attributes) { should == [:acr, :amr, :azp, :jti, :sid, :auth_time, :nonce, :sub_jwk, :at_hash, :c_hash, :s_hash] }
23
23
 
24
24
  describe 'auth_time' do
25
25
  subject { id_token.auth_time }
@@ -157,7 +157,7 @@ describe OpenIDConnect::ResponseObject::IdToken do
157
157
  t = id_token.to_jwt private_key do |t|
158
158
  t.header[:x5u] = "http://server.example.com/x5u"
159
159
  end
160
- h = UrlSafeBase64.decode64 t.split('.').first
160
+ h = Base64.urlsafe_decode64 t.split('.').first
161
161
  h.should include 'x5u'
162
162
  end
163
163
  end
@@ -169,8 +169,9 @@ describe OpenIDConnect::ResponseObject::IdToken do
169
169
  jwt = JSON::JWT.decode t, public_key
170
170
  jwt.should include :at_hash
171
171
  jwt.should_not include :c_hash
172
- jwt[:at_hash].should == UrlSafeBase64.encode64(
173
- OpenSSL::Digest::SHA256.digest('access_token')[0, 128 / 8]
172
+ jwt[:at_hash].should == Base64.urlsafe_encode64(
173
+ OpenSSL::Digest::SHA256.digest('access_token')[0, 128 / 8],
174
+ padding: false
174
175
  )
175
176
  end
176
177
  end
@@ -193,8 +194,9 @@ describe OpenIDConnect::ResponseObject::IdToken do
193
194
  jwt = JSON::JWT.decode t, public_key
194
195
  jwt.should_not include :at_hash
195
196
  jwt.should include :c_hash
196
- jwt[:c_hash].should == UrlSafeBase64.encode64(
197
- OpenSSL::Digest::SHA256.digest('authorization_code')[0, 128 / 8]
197
+ jwt[:c_hash].should == Base64.urlsafe_encode64(
198
+ OpenSSL::Digest::SHA256.digest('authorization_code')[0, 128 / 8],
199
+ padding: false
198
200
  )
199
201
  end
200
202
  end
@@ -209,11 +211,13 @@ describe OpenIDConnect::ResponseObject::IdToken do
209
211
  jwt = JSON::JWT.decode t, public_key
210
212
  jwt.should include :at_hash
211
213
  jwt.should include :c_hash
212
- jwt[:at_hash].should == UrlSafeBase64.encode64(
213
- OpenSSL::Digest::SHA256.digest('access_token')[0, 128 / 8]
214
+ jwt[:at_hash].should == Base64.urlsafe_encode64(
215
+ OpenSSL::Digest::SHA256.digest('access_token')[0, 128 / 8],
216
+ padding: false
214
217
  )
215
- jwt[:c_hash].should == UrlSafeBase64.encode64(
216
- OpenSSL::Digest::SHA256.digest('authorization_code')[0, 128 / 8]
218
+ jwt[:c_hash].should == Base64.urlsafe_encode64(
219
+ OpenSSL::Digest::SHA256.digest('authorization_code')[0, 128 / 8],
220
+ padding: false
217
221
  )
218
222
  end
219
223
  end
@@ -247,6 +251,54 @@ describe OpenIDConnect::ResponseObject::IdToken do
247
251
  its(:exp) { should == attributes[:exp].to_i }
248
252
  its(:raw_attributes) { should be_instance_of JSON::JWS }
249
253
 
254
+ context 'when IdP config is given' do
255
+ subject { klass.decode id_token.to_jwt(private_key), idp_config }
256
+ let(:jwks) do
257
+ jwk_str = File.read(File.join(__dir__, '../../mock_response/public_keys/jwks_with_private_key.json'))
258
+ jwk = JSON::JWK::Set.new JSON.parse(jwk_str)
259
+ end
260
+ let(:idp_config) do
261
+ OpenIDConnect::Discovery::Provider::Config::Response.new(
262
+ issuer: attributes[:issuer],
263
+ authorization_endpoint: File.join(attributes[:iss], 'authorize'),
264
+ jwks_uri: File.join(attributes[:iss], 'jwks'),
265
+ response_types_supported: ['code'],
266
+ subject_types_supported: ['public'],
267
+ id_token_signing_alg_values_supported: ['RS256']
268
+ )
269
+ end
270
+
271
+ context 'when id_token has kid' do
272
+ let(:private_key) do
273
+ OpenSSL::PKey::RSA.new(
274
+ File.read(File.join(__dir__, '../../mock_response/public_keys/private_key.pem'))
275
+ ).to_jwk
276
+ end
277
+
278
+ it do
279
+ mock_json :get, idp_config.jwks_uri, 'public_keys/jwks_with_private_key' do
280
+ should be_a klass
281
+ end
282
+ end
283
+ end
284
+
285
+ context 'otherwise' do
286
+ let(:private_key) do
287
+ OpenSSL::PKey::RSA.new(
288
+ File.read(File.join(__dir__, '../../mock_response/public_keys/private_key.pem'))
289
+ )
290
+ end
291
+
292
+ it do
293
+ mock_json :get, idp_config.jwks_uri, 'public_keys/jwks_with_private_key' do
294
+ expect do
295
+ should
296
+ end.to raise_error JSON::JWK::Set::KidNotFound
297
+ end
298
+ end
299
+ end
300
+ end
301
+
250
302
  context 'when self-issued' do
251
303
  context 'when valid' do
252
304
  let(:self_issued) do
@@ -315,4 +367,4 @@ describe OpenIDConnect::ResponseObject::IdToken do
315
367
  its(:sub_jwk) { should == sub_jwk}
316
368
  its(:subject) { should == sub_jwk.thumbprint }
317
369
  end
318
- end
370
+ end
@@ -46,12 +46,12 @@ describe OpenIDConnect do
46
46
  context 'with http_config' do
47
47
  before do
48
48
  OpenIDConnect.http_config do |config|
49
- config.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
49
+ config.ssl.verify = false
50
50
  end
51
51
  end
52
52
  it 'should configure OpenIDConnect, SWD and Rack::OAuth2\'s http_client' do
53
53
  [OpenIDConnect, SWD, WebFinger, Rack::OAuth2].each do |klass|
54
- klass.http_client.ssl_config.verify_mode.should == OpenSSL::SSL::VERIFY_NONE
54
+ klass.http_client.ssl.verify.should be_falsy
55
55
  end
56
56
  end
57
57
  end
metadata CHANGED
@@ -1,59 +1,59 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openid_connect
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - nov matake
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-23 00:00:00.000000000 Z
11
+ date: 2022-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: json
14
+ name: tzinfo
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.4.3
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 1.4.3
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: tzinfo
28
+ name: attr_required
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 1.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 1.0.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: attr_required
42
+ name: activemodel
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 1.0.0
47
+ version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 1.0.0
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: activemodel
56
+ name: validate_url
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: validate_url
70
+ name: validate_email
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,21 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: validate_email
84
+ name: faraday
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: faraday-follow_redirects
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - ">="
@@ -100,56 +114,70 @@ dependencies:
100
114
  requirements:
101
115
  - - ">="
102
116
  - !ruby/object:Gem::Version
103
- version: 1.5.0
117
+ version: '1.16'
104
118
  type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - ">="
109
123
  - !ruby/object:Gem::Version
110
- version: 1.5.0
124
+ version: '1.16'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: swd
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - ">="
129
+ - - "~>"
116
130
  - !ruby/object:Gem::Version
117
- version: 1.0.0
131
+ version: '2.0'
118
132
  type: :runtime
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - ">="
136
+ - - "~>"
123
137
  - !ruby/object:Gem::Version
124
- version: 1.0.0
138
+ version: '2.0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: webfinger
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
- - - ">="
143
+ - - "~>"
130
144
  - !ruby/object:Gem::Version
131
- version: 1.0.1
145
+ version: '2.0'
132
146
  type: :runtime
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
- - - ">="
150
+ - - "~>"
137
151
  - !ruby/object:Gem::Version
138
- version: 1.0.1
152
+ version: '2.0'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: rack-oauth2
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '2.2'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '2.2'
167
+ - !ruby/object:Gem::Dependency
168
+ name: net-smtp
141
169
  requirement: !ruby/object:Gem::Requirement
142
170
  requirements:
143
171
  - - ">="
144
172
  - !ruby/object:Gem::Version
145
- version: 1.6.0
173
+ version: '0'
146
174
  type: :runtime
147
175
  prerelease: false
148
176
  version_requirements: !ruby/object:Gem::Requirement
149
177
  requirements:
150
178
  - - ">="
151
179
  - !ruby/object:Gem::Version
152
- version: 1.6.0
180
+ version: '0'
153
181
  - !ruby/object:Gem::Dependency
154
182
  name: rake
155
183
  requirement: !ruby/object:Gem::Requirement
@@ -220,6 +248,20 @@ dependencies:
220
248
  - - ">="
221
249
  - !ruby/object:Gem::Version
222
250
  version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: rexml
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
223
265
  description: OpenID Connect Server & Client Library
224
266
  email:
225
267
  - nov@matake.jp
@@ -227,9 +269,11 @@ executables: []
227
269
  extensions: []
228
270
  extra_rdoc_files: []
229
271
  files:
272
+ - ".github/FUNDING.yml"
273
+ - ".github/workflows/spec.yml"
230
274
  - ".gitignore"
231
275
  - ".rspec"
232
- - ".travis.yml"
276
+ - CHANGELOG.md
233
277
  - Gemfile
234
278
  - LICENSE
235
279
  - README.rdoc
@@ -238,11 +282,10 @@ files:
238
282
  - VERSION
239
283
  - lib/openid_connect.rb
240
284
  - lib/openid_connect/access_token.rb
285
+ - lib/openid_connect/access_token/mtls.rb
241
286
  - lib/openid_connect/client.rb
242
287
  - lib/openid_connect/client/registrar.rb
243
288
  - lib/openid_connect/connect_object.rb
244
- - lib/openid_connect/debugger.rb
245
- - lib/openid_connect/debugger/request_filter.rb
246
289
  - lib/openid_connect/discovery.rb
247
290
  - lib/openid_connect/discovery/provider.rb
248
291
  - lib/openid_connect/discovery/provider/config.rb
@@ -272,6 +315,7 @@ files:
272
315
  - spec/mock_response/access_token/bearer_with_id_token.json
273
316
  - spec/mock_response/access_token/invalid_json.json
274
317
  - spec/mock_response/access_token/mac.json
318
+ - spec/mock_response/access_token/without_token_type.json
275
319
  - spec/mock_response/client/registered.json
276
320
  - spec/mock_response/client/rotated.json
277
321
  - spec/mock_response/client/updated.json
@@ -288,13 +332,14 @@ files:
288
332
  - spec/mock_response/errors/unknown.json
289
333
  - spec/mock_response/id_token.json
290
334
  - spec/mock_response/public_keys/jwks.json
335
+ - spec/mock_response/public_keys/jwks_with_private_key.json
336
+ - spec/mock_response/public_keys/private_key.pem
291
337
  - spec/mock_response/request_object/signed.jwt
292
338
  - spec/mock_response/userinfo/openid.json
293
339
  - spec/openid_connect/access_token_spec.rb
294
340
  - spec/openid_connect/client/registrar_spec.rb
295
341
  - spec/openid_connect/client_spec.rb
296
342
  - spec/openid_connect/connect_object_spec.rb
297
- - spec/openid_connect/debugger/request_filter_spec.rb
298
343
  - spec/openid_connect/discovery/provider/config/resource_spec.rb
299
344
  - spec/openid_connect/discovery/provider/config/response_spec.rb
300
345
  - spec/openid_connect/discovery/provider/config_spec.rb
@@ -317,7 +362,7 @@ homepage: https://github.com/nov/openid_connect
317
362
  licenses:
318
363
  - MIT
319
364
  metadata: {}
320
- post_install_message:
365
+ post_install_message:
321
366
  rdoc_options: []
322
367
  require_paths:
323
368
  - lib
@@ -332,9 +377,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
332
377
  - !ruby/object:Gem::Version
333
378
  version: '0'
334
379
  requirements: []
335
- rubyforge_project:
336
- rubygems_version: 2.6.8
337
- signing_key:
380
+ rubygems_version: 3.3.7
381
+ signing_key:
338
382
  specification_version: 4
339
383
  summary: OpenID Connect Server & Client Library
340
384
  test_files:
@@ -344,6 +388,7 @@ test_files:
344
388
  - spec/mock_response/access_token/bearer_with_id_token.json
345
389
  - spec/mock_response/access_token/invalid_json.json
346
390
  - spec/mock_response/access_token/mac.json
391
+ - spec/mock_response/access_token/without_token_type.json
347
392
  - spec/mock_response/client/registered.json
348
393
  - spec/mock_response/client/rotated.json
349
394
  - spec/mock_response/client/updated.json
@@ -360,13 +405,14 @@ test_files:
360
405
  - spec/mock_response/errors/unknown.json
361
406
  - spec/mock_response/id_token.json
362
407
  - spec/mock_response/public_keys/jwks.json
408
+ - spec/mock_response/public_keys/jwks_with_private_key.json
409
+ - spec/mock_response/public_keys/private_key.pem
363
410
  - spec/mock_response/request_object/signed.jwt
364
411
  - spec/mock_response/userinfo/openid.json
365
412
  - spec/openid_connect/access_token_spec.rb
366
413
  - spec/openid_connect/client/registrar_spec.rb
367
414
  - spec/openid_connect/client_spec.rb
368
415
  - spec/openid_connect/connect_object_spec.rb
369
- - spec/openid_connect/debugger/request_filter_spec.rb
370
416
  - spec/openid_connect/discovery/provider/config/resource_spec.rb
371
417
  - spec/openid_connect/discovery/provider/config/response_spec.rb
372
418
  - spec/openid_connect/discovery/provider/config_spec.rb
data/.travis.yml DELETED
@@ -1,7 +0,0 @@
1
- before_install:
2
- - gem install bundler
3
-
4
- rvm:
5
- - 2.2.2
6
- - 2.2.5
7
- - 2.3.1
@@ -1,28 +0,0 @@
1
- module OpenIDConnect
2
- module Debugger
3
- class RequestFilter
4
- # Callback called in HTTPClient (before sending a request)
5
- # request:: HTTP::Message
6
- def filter_request(request)
7
- started = "======= [OpenIDConnect] HTTP REQUEST STARTED ======="
8
- log started, request.dump
9
- end
10
-
11
- # Callback called in HTTPClient (after received a response)
12
- # request:: HTTP::Message
13
- # response:: HTTP::Message
14
- def filter_response(request, response)
15
- finished = "======= [OpenIDConnect] HTTP REQUEST FINISHED ======="
16
- log '-' * 50, response.dump, finished
17
- end
18
-
19
- private
20
-
21
- def log(*outputs)
22
- outputs.each do |output|
23
- OpenIDConnect.logger.info output
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,3 +0,0 @@
1
- Dir[File.dirname(__FILE__) + '/debugger/*.rb'].each do |file|
2
- require file
3
- end
@@ -1,33 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe OpenIDConnect::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) { OpenIDConnect::Debugger::RequestFilter.new }
8
-
9
- describe '#filter_request' do
10
- it 'should log request' do
11
- [
12
- "======= [OpenIDConnect] HTTP REQUEST STARTED =======",
13
- request.dump
14
- ].each do |output|
15
- expect(OpenIDConnect.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
- "======= [OpenIDConnect] HTTP REQUEST FINISHED ======="
27
- ].each do |output|
28
- expect(OpenIDConnect.logger).to receive(:info).with output
29
- end
30
- request_filter.filter_response(request, response)
31
- end
32
- end
33
- end