openid_connect 1.4.2 → 2.3.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fc2fbaf7f12786bfb4695776c65b78a58a7730730382b138a8b53b6149939989
4
- data.tar.gz: 54d98cef9172883b53426b457ab41cb743d078ae9ed20eb8b374628802cebf1d
3
+ metadata.gz: 1846c96c032313eff89f8fcb9a753643c373ff00d6de12254b7f679d7802b4ab
4
+ data.tar.gz: 58c0780a7873c51f18fad3d847272fa49b59d88992a0833cf3f3396edc6d9303
5
5
  SHA512:
6
- metadata.gz: f3bc8fec5821911fbf334a27c9bc2d49dd7871cd5379a9ff91b7a5d1f05b017cece154744b4eb6283b3eea64dbf2cd6cb2fc61fe66a1f75c4dbf21aa97180646
7
- data.tar.gz: '09845c6ec9f7d8a198333d49eab6511f25fccd7d31a6ea7f59456700f44eab420ae4dbe2d96d28e541f7cd7b5f9bf0c5976ee19a85b7397904c3debd45db01e9'
6
+ metadata.gz: 4d605a9a6301af104cf1173b8626e5c1403a930b16cd49c738e2b7e08a8b8f23cfac4d53cfc649cb5484c73e22e1dc3c8b72941abda64942c405931cc17392e8
7
+ data.tar.gz: 70c4fcd75e6f7913475b5d8c070df75d37c242e3888010b5ec30eba95784258577b6de1575f52e494d44bf0c475a6d62b76e180c67c7e573f198ff910cf35d7c
@@ -3,7 +3,7 @@ name: Spec
3
3
  on:
4
4
  push:
5
5
  branches:
6
- - master
6
+ - main
7
7
  pull_request:
8
8
 
9
9
  permissions:
@@ -13,12 +13,11 @@ jobs:
13
13
  spec:
14
14
  strategy:
15
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
16
+ os: ['ubuntu-20.04', 'ubuntu-22.04']
17
+ ruby-version: ['3.1', '3.2', '3.3']
19
18
  include:
20
- - os: 'ubuntu-22.04'
21
- ruby-version: '3.1'
19
+ - os: 'ubuntu-20.04'
20
+ ruby-version: '3.0'
22
21
  runs-on: ${{ matrix.os }}
23
22
 
24
23
  steps:
data/CHANGELOG.md ADDED
@@ -0,0 +1,23 @@
1
+ ## [Unreleased]
2
+
3
+ ## [2.2.0] - 2022-10-11
4
+
5
+ ### Changed
6
+
7
+ - automatic json response decoding by @nov in https://github.com/nov/openid_connect/pull/77
8
+
9
+ ## [2.1.0] - 2022-10-10
10
+
11
+ ### Changed
12
+
13
+ - mTLS access token by @nov in https://github.com/nov/openid_connect/pull/76
14
+
15
+ ## [2.0.0] - 2022-10-09
16
+
17
+ ### Added
18
+
19
+ - start recording CHANGELOG
20
+
21
+ ### Changed
22
+
23
+ - replace httpclient with faraday v2 by @nov in https://github.com/nov/openid_connect/pull/75
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.4.2
1
+ 2.3.1
@@ -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,15 +15,22 @@ 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
- raise BadRequest.new('API Access Faild', res)
33
+ raise BadRequest.new('API Access Failed', res)
27
34
  when 401
28
35
  raise Unauthorized.new('Access Token Invalid or Expired', res)
29
36
  when 403
@@ -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'
@@ -118,7 +118,7 @@ module OpenIDConnect
118
118
 
119
119
  def valid_uri?(uri, schemes = ['http', 'https'])
120
120
  # NOTE: specify nil for schemes to allow any schemes
121
- URI::regexp(schemes).match(uri).present?
121
+ URI::DEFAULT_PARSER.make_regexp(schemes).match(uri).present?
122
122
  end
123
123
 
124
124
  def validate_contacts
@@ -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,7 +26,7 @@ module OpenIDConnect
26
26
  end
27
27
 
28
28
  def handle_success_response(response)
29
- token_hash = JSON.parse(response.body).with_indifferent_access
29
+ token_hash = response.body.with_indifferent_access
30
30
  token_type = (@forced_token_type || token_hash[:token_type]).try(:downcase)
31
31
  case token_type
32
32
  when 'bearer'
@@ -34,8 +34,6 @@ module OpenIDConnect
34
34
  else
35
35
  raise Exception.new("Unexpected Token Type: #{token_type}")
36
36
  end
37
- rescue JSON::ParserError
38
- raise Exception.new("Unknown Token Type")
39
37
  end
40
38
  end
41
39
  end
@@ -81,9 +81,7 @@ module OpenIDConnect
81
81
  end
82
82
 
83
83
  def jwks
84
- @jwks ||= JSON.parse(
85
- OpenIDConnect.http_client.get_content(jwks_uri)
86
- ).with_indifferent_access
84
+ @jwks ||= OpenIDConnect.http_client.get(jwks_uri).body.with_indifferent_access
87
85
  JSON::JWK::Set.new @jwks[:keys]
88
86
  end
89
87
 
@@ -25,7 +25,7 @@ module OpenIDConnect
25
25
  end
26
26
 
27
27
  def fetch(request_uri, key = nil)
28
- jwt_string = OpenIDConnect.http_client.get_content(request_uri)
28
+ jwt_string = OpenIDConnect.http_client.get(request_uri).body
29
29
  decode jwt_string, key
30
30
  end
31
31
  end
@@ -1,11 +1,14 @@
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'
6
8
  require 'tzinfo'
7
9
  require 'validate_url'
8
- require 'validate_email'
10
+ require 'email_validator/strict'
11
+ require 'mail'
9
12
  require 'attr_required'
10
13
  require 'attr_optional'
11
14
  require 'json/jwt'
@@ -64,17 +67,14 @@ module OpenIDConnect
64
67
  self.debugging = false
65
68
 
66
69
  def self.http_client
67
- _http_client_ = HTTPClient.new(
68
- agent_name: "OpenIDConnect (#{VERSION})"
69
- )
70
-
71
- # NOTE: httpclient gem seems stopped maintaining root certtificate set, use OS default.
72
- _http_client_.ssl_config.clear_cert_store
73
- _http_client_.ssl_config.cert_store.set_default_paths
74
-
75
- _http_client_.request_filter << Debugger::RequestFilter.new if debugging?
76
- http_config.try(:call, _http_client_)
77
- _http_client_
70
+ Faraday.new(headers: {user_agent: "OpenIDConnect (#{VERSION})"}) do |faraday|
71
+ faraday.request :url_encoded
72
+ faraday.request :json
73
+ faraday.response :json
74
+ faraday.adapter Faraday.default_adapter
75
+ http_config&.call(faraday)
76
+ faraday.response :logger, OpenIDConnect.logger, {bodies: true} if debugging?
77
+ end
78
78
  end
79
79
  def self.http_config(&block)
80
80
  @sub_protocols.each do |klass|
@@ -100,4 +100,3 @@ require 'openid_connect/access_token'
100
100
  require 'openid_connect/jwtnizable'
101
101
  require 'openid_connect/connect_object'
102
102
  require 'openid_connect/discovery'
103
- require 'openid_connect/debugger'
@@ -16,17 +16,14 @@ Gem::Specification.new do |s|
16
16
  s.add_runtime_dependency "attr_required", ">= 1.0.0"
17
17
  s.add_runtime_dependency "activemodel"
18
18
  s.add_runtime_dependency "validate_url"
19
- s.add_runtime_dependency "validate_email"
20
- s.add_runtime_dependency "json-jwt", ">= 1.15.0"
21
- s.add_runtime_dependency "swd", "~> 1.3"
22
- s.add_runtime_dependency "webfinger", "~> 1.2"
23
- s.add_runtime_dependency "rack-oauth2", "~> 1.21"
24
- if Gem.ruby_version >= Gem::Version.create(3.1)
25
- # TODO:
26
- # remove "net-smtp" dependency after mail gem 2.8+ (which supports ruby 3.1+) released.
27
- # ref.) https://rubygems.org/gems/mailhttps://github.com/mikel/mail
28
- s.add_runtime_dependency "net-smtp"
29
- end
19
+ s.add_runtime_dependency "email_validator"
20
+ s.add_runtime_dependency "mail"
21
+ s.add_runtime_dependency 'faraday', '~> 2.0'
22
+ s.add_runtime_dependency 'faraday-follow_redirects'
23
+ s.add_runtime_dependency "json-jwt", ">= 1.16"
24
+ s.add_runtime_dependency "swd", "~> 2.0"
25
+ s.add_runtime_dependency "webfinger", "~> 2.0"
26
+ s.add_runtime_dependency "rack-oauth2", "~> 2.2"
30
27
  s.add_development_dependency "rake"
31
28
  s.add_development_dependency "rspec"
32
29
  s.add_development_dependency "rspec-its"
@@ -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
@@ -1 +1,3 @@
1
- Fuckin Unknown Error
1
+ {
2
+ "unknown": "unknown"
3
+ }
@@ -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,16 +162,6 @@ 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
@@ -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,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openid_connect
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.2
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - nov matake
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-08 00:00:00.000000000 Z
11
+ date: 2024-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tzinfo
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: validate_email
70
+ name: email_validator
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,75 +81,103 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: json-jwt
84
+ name: mail
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: 1.15.0
89
+ version: '0'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: 1.15.0
96
+ version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: swd
98
+ name: faraday
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '1.3'
103
+ version: '2.0'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '1.3'
110
+ version: '2.0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: webfinger
112
+ name: faraday-follow_redirects
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: json-jwt
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '1.16'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '1.16'
139
+ - !ruby/object:Gem::Dependency
140
+ name: swd
113
141
  requirement: !ruby/object:Gem::Requirement
114
142
  requirements:
115
143
  - - "~>"
116
144
  - !ruby/object:Gem::Version
117
- version: '1.2'
145
+ version: '2.0'
118
146
  type: :runtime
119
147
  prerelease: false
120
148
  version_requirements: !ruby/object:Gem::Requirement
121
149
  requirements:
122
150
  - - "~>"
123
151
  - !ruby/object:Gem::Version
124
- version: '1.2'
152
+ version: '2.0'
125
153
  - !ruby/object:Gem::Dependency
126
- name: rack-oauth2
154
+ name: webfinger
127
155
  requirement: !ruby/object:Gem::Requirement
128
156
  requirements:
129
157
  - - "~>"
130
158
  - !ruby/object:Gem::Version
131
- version: '1.21'
159
+ version: '2.0'
132
160
  type: :runtime
133
161
  prerelease: false
134
162
  version_requirements: !ruby/object:Gem::Requirement
135
163
  requirements:
136
164
  - - "~>"
137
165
  - !ruby/object:Gem::Version
138
- version: '1.21'
166
+ version: '2.0'
139
167
  - !ruby/object:Gem::Dependency
140
- name: net-smtp
168
+ name: rack-oauth2
141
169
  requirement: !ruby/object:Gem::Requirement
142
170
  requirements:
143
- - - ">="
171
+ - - "~>"
144
172
  - !ruby/object:Gem::Version
145
- version: '0'
173
+ version: '2.2'
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: '0'
180
+ version: '2.2'
153
181
  - !ruby/object:Gem::Dependency
154
182
  name: rake
155
183
  requirement: !ruby/object:Gem::Requirement
@@ -245,6 +273,7 @@ files:
245
273
  - ".github/workflows/spec.yml"
246
274
  - ".gitignore"
247
275
  - ".rspec"
276
+ - CHANGELOG.md
248
277
  - Gemfile
249
278
  - LICENSE
250
279
  - README.rdoc
@@ -253,11 +282,10 @@ files:
253
282
  - VERSION
254
283
  - lib/openid_connect.rb
255
284
  - lib/openid_connect/access_token.rb
285
+ - lib/openid_connect/access_token/mtls.rb
256
286
  - lib/openid_connect/client.rb
257
287
  - lib/openid_connect/client/registrar.rb
258
288
  - lib/openid_connect/connect_object.rb
259
- - lib/openid_connect/debugger.rb
260
- - lib/openid_connect/debugger/request_filter.rb
261
289
  - lib/openid_connect/discovery.rb
262
290
  - lib/openid_connect/discovery/provider.rb
263
291
  - lib/openid_connect/discovery/provider/config.rb
@@ -312,7 +340,6 @@ files:
312
340
  - spec/openid_connect/client/registrar_spec.rb
313
341
  - spec/openid_connect/client_spec.rb
314
342
  - spec/openid_connect/connect_object_spec.rb
315
- - spec/openid_connect/debugger/request_filter_spec.rb
316
343
  - spec/openid_connect/discovery/provider/config/resource_spec.rb
317
344
  - spec/openid_connect/discovery/provider/config/response_spec.rb
318
345
  - spec/openid_connect/discovery/provider/config_spec.rb
@@ -350,7 +377,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
350
377
  - !ruby/object:Gem::Version
351
378
  version: '0'
352
379
  requirements: []
353
- rubygems_version: 3.3.7
380
+ rubygems_version: 3.5.16
354
381
  signing_key:
355
382
  specification_version: 4
356
383
  summary: OpenID Connect Server & Client Library
@@ -386,7 +413,6 @@ test_files:
386
413
  - spec/openid_connect/client/registrar_spec.rb
387
414
  - spec/openid_connect/client_spec.rb
388
415
  - spec/openid_connect/connect_object_spec.rb
389
- - spec/openid_connect/debugger/request_filter_spec.rb
390
416
  - spec/openid_connect/discovery/provider/config/resource_spec.rb
391
417
  - spec/openid_connect/discovery/provider/config/response_spec.rb
392
418
  - spec/openid_connect/discovery/provider/config_spec.rb
@@ -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