omniauth-cloudiap 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4dd63aa4dba59ff3b4251103f4dc8202f9dfbe39753e967f47133a7cd7b4c907
4
- data.tar.gz: e8aaf738e50bdb425c8cd6a57ac3bc5a3b9a7945323187e46b1498f2cc89225e
3
+ metadata.gz: 71d630cae4e35a08c26c0605fb042a9e9f290a2f5598432521581af23555ff04
4
+ data.tar.gz: 479bc4020c0106fc46361906ff26e83a105a0507453d37f2252e4825f5f71957
5
5
  SHA512:
6
- metadata.gz: 69b1f7761fd89ff7bcb3974ac08d3b836271020fb50dd324bb1226359a15d71a92c0aeb28d27c1f330eae27f406c8a1868f125666c3d5bf2fb0185a1c1d26b5b
7
- data.tar.gz: 2270c3f8e4865b62f81825633b88b2fcdb35beb2fec1cbad77c45937f976e2acb1a6c3926f1adfe4e918d984a364011d7f7d78fcedd742d725d9aaea26cc9160
6
+ metadata.gz: d79d2795cca365f18c65155776790bd1783c6f0fe55e6f93b50fec117407a6129b6b58223ab7e21dab30caa75cb63ea2777aeac2315a5e05278f0ea6c859e5db
7
+ data.tar.gz: 6c3275328d58b65a8806add7d93c6f6bceada32c43ac93c457653eec5b462ca420bebee0c8a9cb152d1fd29fbab4454b8a691c8e8dd6ffd5c2e25a3d20b55f1b
data/.rubocop.yml ADDED
@@ -0,0 +1,45 @@
1
+
2
+ AllCops:
3
+ TargetRubyVersion: 3.0
4
+ NewCops: enable
5
+ Exclude:
6
+ - 'omniauth-cloudiap.gemspec'
7
+
8
+ Metrics/AbcSize:
9
+ Max: 28
10
+
11
+ Metrics/MethodLength:
12
+ Enabled: false
13
+
14
+ Style/NumericLiterals:
15
+ MinDigits: 11
16
+
17
+ Style/FrozenStringLiteralComment:
18
+ Enabled: false
19
+
20
+ Style/StringLiterals:
21
+ EnforcedStyle: double_quotes
22
+
23
+ Style/TrailingCommaInHashLiteral:
24
+ EnforcedStyleForMultiline: consistent_comma
25
+
26
+ Style/TrailingCommaInArguments:
27
+ EnforcedStyleForMultiline: consistent_comma
28
+
29
+ Style/Documentation:
30
+ Enabled: false
31
+
32
+ Style/IfUnlessModifier:
33
+ Enabled: false
34
+
35
+ Style/GuardClause:
36
+ Enabled: false
37
+
38
+ Style/SignalException:
39
+ EnforcedStyle: semantic
40
+
41
+ Style/RescueStandardError:
42
+ EnforcedStyle: implicit
43
+
44
+ Layout/FirstHashElementIndentation:
45
+ EnforcedStyle: consistent
data/CHANGELOG.md CHANGED
@@ -1,8 +1,9 @@
1
1
  Changelog
2
2
  ===========
3
3
 
4
+ ## 1.1.0 - 2024-06-04
5
+ - Change validation method to use ruby-jwt to avoid openssl3 error
4
6
 
5
- 1.0.0 - 2018-11-21
6
- --------------------
7
+ ## 1.0.0 - 2018-11-21
7
8
 
8
9
  - First release
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in omniauth-cloudiap.gemspec
6
6
  gemspec
data/Gemfile.lock CHANGED
@@ -1,40 +1,81 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- omniauth-cloudiap (0.1.0)
4
+ omniauth-cloudiap (1.1.0)
5
5
  jwt
6
6
  omniauth
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- hashie (3.5.7)
12
- jwt (2.1.0)
13
- minitest (5.11.3)
14
- minitest-power_assert (0.3.0)
11
+ ast (2.4.2)
12
+ base64 (0.2.0)
13
+ hashie (5.0.0)
14
+ json (2.7.2)
15
+ jwt (2.8.1)
16
+ base64
17
+ language_server-protocol (3.17.0.3)
18
+ minitest (5.23.1)
19
+ minitest-power_assert (0.3.1)
15
20
  minitest
16
21
  power_assert (>= 1.1)
17
- omniauth (1.8.1)
18
- hashie (>= 3.4.6, < 3.6.0)
19
- rack (>= 1.6.2, < 3)
20
- power_assert (1.1.3)
21
- rack (2.0.6)
22
- rack-test (1.1.0)
23
- rack (>= 1.0, < 3)
24
- rake (10.5.0)
25
- timecop (0.9.1)
22
+ minitest-stub_any_instance (1.0.3)
23
+ omniauth (2.1.2)
24
+ hashie (>= 3.4.6)
25
+ rack (>= 2.2.3)
26
+ rack-protection
27
+ parallel (1.24.0)
28
+ parser (3.3.2.0)
29
+ ast (~> 2.4.1)
30
+ racc
31
+ power_assert (2.0.3)
32
+ racc (1.8.0)
33
+ rack (3.0.11)
34
+ rack-protection (4.0.0)
35
+ base64 (>= 0.1.0)
36
+ rack (>= 3.0.0, < 4)
37
+ rack-session (2.0.0)
38
+ rack (>= 3.0.0)
39
+ rack-test (2.1.0)
40
+ rack (>= 1.3)
41
+ rainbow (3.1.1)
42
+ rake (13.2.1)
43
+ regexp_parser (2.9.2)
44
+ rexml (3.2.8)
45
+ strscan (>= 3.0.9)
46
+ rubocop (1.64.1)
47
+ json (~> 2.3)
48
+ language_server-protocol (>= 3.17.0)
49
+ parallel (~> 1.10)
50
+ parser (>= 3.3.0.2)
51
+ rainbow (>= 2.2.2, < 4.0)
52
+ regexp_parser (>= 1.8, < 3.0)
53
+ rexml (>= 3.2.5, < 4.0)
54
+ rubocop-ast (>= 1.31.1, < 2.0)
55
+ ruby-progressbar (~> 1.7)
56
+ unicode-display_width (>= 2.4.0, < 3.0)
57
+ rubocop-ast (1.31.3)
58
+ parser (>= 3.3.1.0)
59
+ ruby-progressbar (1.13.0)
60
+ strscan (3.1.0)
61
+ timecop (0.9.9)
62
+ unicode-display_width (2.5.0)
26
63
 
27
64
  PLATFORMS
65
+ arm64-darwin-22
28
66
  ruby
29
67
 
30
68
  DEPENDENCIES
31
- bundler (~> 1.17)
32
- minitest (~> 5.0)
69
+ bundler
70
+ minitest
33
71
  minitest-power_assert
72
+ minitest-stub_any_instance
34
73
  omniauth-cloudiap!
74
+ rack-session
35
75
  rack-test
36
- rake (~> 10.0)
76
+ rake
77
+ rubocop
37
78
  timecop
38
79
 
39
80
  BUNDLED WITH
40
- 1.17.1
81
+ 2.5.11
data/Rakefile CHANGED
@@ -7,4 +7,4 @@ Rake::TestTask.new(:test) do |t|
7
7
  t.test_files = FileList["test/**/*_test.rb"]
8
8
  end
9
9
 
10
- task :default => :test
10
+ task default: :test
@@ -1,11 +1,10 @@
1
- require 'jwt'
2
- require 'open-uri'
3
- require 'json'
1
+ require "jwt"
2
+ require "open-uri"
3
+ require "json"
4
4
 
5
5
  module OmniAuth
6
6
  module Cloudiap
7
7
  class IAPJWT
8
-
9
8
  class InvalidAudError < Error; end
10
9
 
11
10
  def initialize(aud: nil)
@@ -13,56 +12,51 @@ module OmniAuth
13
12
  end
14
13
 
15
14
  def decode_with_validate(token)
16
- payload, header = validate(token)
15
+ payload, = validate(token)
17
16
  { identifier: payload["sub"], email: payload["email"] }
18
17
  end
19
18
 
20
19
  def parse(token)
21
- JWT.decode token, nil, false
20
+ JWT.decode(token, nil, true, algorithms: algorithms, jwks: jwks)
22
21
  end
23
22
 
24
23
  def jwk_keys
25
- @jwk_keys ||= begin
26
- url = "https://www.gstatic.com/iap/verify/public_key-jwk"
27
- open(url) { |f| JSON.parse(f.read) }
28
- end
24
+ url = "https://www.gstatic.com/iap/verify/public_key-jwk"
25
+ URI.open(url) { |f| JSON.parse(f.read) } # rubocop:disable Security/Open
29
26
  end
30
27
 
31
- def jwk_key(token)
32
- _, header = parse(token)
33
- jwk = jwk_keys["keys"].find{|k| k["kid"] == header["kid"] }
34
- curve_name = \
35
- case jwk["crv"]
36
- when "P-256"
37
- "prime256v1"
38
- when "P-384"
39
- "secp384r1"
40
- when "P-521"
41
- "secp521r1"
42
- else
43
- raise AugumentError, "Unknown crv: #{jwk["crv"]}"
44
- end
45
- x = Base64.urlsafe_decode64(jwk["x"])
46
- y = Base64.urlsafe_decode64(jwk["y"])
47
-
48
- key = OpenSSL::PKey::EC.new(curve_name)
49
- group = OpenSSL::PKey::EC::Group.new(curve_name)
50
- bn = OpenSSL::BN.new(["04" + x.unpack("H*").first + y.unpack("H*").first].pack("H*"), 2)
51
- key.public_key = OpenSSL::PKey::EC::Point.new(group, bn)
52
- key
28
+ def jwks_loader(options)
29
+ if options[:kid_not_found] && @cache_last_update < Time.now.to_i - 300
30
+ logger.info("Invalidating JWK cache. #{options[:kid]} not found from previous cache")
31
+ @cached_keys = nil
32
+ end
33
+ @cached_keys ||= begin # rubocop:disable Naming/MemoizedInstanceVariableName
34
+ @cache_last_update = Time.now.to_i
35
+ jwks = JWT::JWK::Set.new(jwk_keys)
36
+ jwks.select! { |key| key[:use] == "sig" } # Signing Keys only
37
+ jwks
38
+ end
53
39
  end
54
40
 
55
- def validate(token)
56
- iss = "https://cloud.google.com/iap"
57
- options = {
58
- algorithm: "ES256",
41
+ def default_jwt_decode_options
42
+ {
59
43
  verify_expiration: true,
60
44
  verify_iat: true,
61
45
  verify_aud: true,
62
46
  verify_iss: true,
63
- iss: iss,
64
47
  }
65
- payload, header = JWT.decode(token, jwk_key(token), true, options)
48
+ end
49
+
50
+ def validate(token)
51
+ iss = "https://cloud.google.com/iap"
52
+ options = default_jwt_decode_options.merge(
53
+ iss: iss,
54
+ algorithm: "ES256",
55
+ jwks: method(:jwks_loader),
56
+ )
57
+
58
+ payload, header = JWT.decode(token, nil, true, options)
59
+
66
60
  if @required_aud
67
61
  validate_aud(@required_aud, payload["aud"])
68
62
  else
@@ -81,7 +75,7 @@ module OmniAuth
81
75
 
82
76
  def validate_aud_format(aud)
83
77
  case aud
84
- when %r|/projects/\d+/apps/\d+|, %r|/projects/\d+/global/backendServices/\d+|
78
+ when %r{/projects/\d+/apps/\d+}, %r{/projects/\d+/global/backendServices/\d+}
85
79
  # do nothing
86
80
  else
87
81
  fail InvalidAudError, aud
@@ -90,4 +84,3 @@ module OmniAuth
90
84
  end
91
85
  end
92
86
  end
93
-
@@ -1,5 +1,5 @@
1
1
  module OmniAuth
2
2
  module Cloudiap
3
- VERSION = "1.0.0"
3
+ VERSION = "1.1.0".freeze
4
4
  end
5
5
  end
@@ -7,4 +7,3 @@ module OmniAuth
7
7
  end
8
8
 
9
9
  require "omniauth/strategies/cloudiap"
10
-
@@ -51,11 +51,11 @@ module OmniAuth
51
51
  end
52
52
 
53
53
  def userinfo_from_jwt
54
- if token = env["HTTP_X_GOOG_IAP_JWT_ASSERTION"]
55
- payload, header = ::OmniAuth::Cloudiap::IAPJWT.new(aud: options[:aud]).validate(token)
54
+ if (token = env["HTTP_X_GOOG_IAP_JWT_ASSERTION"])
55
+ payload, = ::OmniAuth::Cloudiap::IAPJWT.new(aud: options[:aud]).validate(token)
56
56
  uid = payload["sub"].sub(/^accounts.google.com:/, "")
57
57
  email = payload["email"]
58
- result = {
58
+ {
59
59
  uid: uid,
60
60
  email: email,
61
61
  name: username_from_email(email),
@@ -70,7 +70,7 @@ module OmniAuth
70
70
  uid = env["HTTP_X_GOOG_AUTHENTICATED_USER_ID"].sub(/^accounts.google.com:/, "")
71
71
  email = env["HTTP_X_GOOG_AUTHENTICATED_USER_EMAIL"].sub(/^accounts.google.com:/, "")
72
72
 
73
- result = {
73
+ {
74
74
  uid: uid,
75
75
  email: email,
76
76
  name: username_from_email(email),
@@ -78,7 +78,7 @@ module OmniAuth
78
78
  end
79
79
 
80
80
  def username_from_email(email)
81
- if options[:username_callback] && options[:username_callback].respond_to?(:[])
81
+ if options[:username_callback].respond_to?(:[])
82
82
  options[:username_callback][email]
83
83
  else
84
84
  email
@@ -35,13 +35,17 @@ Gem::Specification.new do |spec|
35
35
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
36
36
  spec.require_paths = ["lib"]
37
37
 
38
- spec.add_development_dependency "bundler", "~> 1.17"
39
- spec.add_development_dependency "rake", "~> 10.0"
40
- spec.add_development_dependency "minitest", "~> 5.0"
38
+ spec.add_development_dependency "bundler"
39
+ spec.add_development_dependency "minitest"
41
40
  spec.add_development_dependency "minitest-power_assert"
41
+ spec.add_development_dependency "minitest-stub_any_instance"
42
+ spec.add_development_dependency "rack-session"
42
43
  spec.add_development_dependency "rack-test"
44
+ spec.add_development_dependency "rake"
45
+ spec.add_development_dependency "rubocop"
43
46
  spec.add_development_dependency "timecop"
44
47
 
48
+
45
49
  spec.add_dependency "omniauth"
46
50
  spec.add_dependency "jwt"
47
51
  end
metadata CHANGED
@@ -1,59 +1,73 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omniauth-cloudiap
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - HORII Keima
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-21 00:00:00.000000000 Z
11
+ date: 2024-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.17'
19
+ version: '0'
20
20
  type: :development
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.17'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '0'
34
34
  type: :development
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: '10.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: minitest
42
+ name: minitest-power_assert
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '5.0'
47
+ version: '0'
48
48
  type: :development
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: '5.0'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: minitest-power_assert
56
+ name: minitest-stub_any_instance
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack-session
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - ">="
@@ -80,6 +94,34 @@ dependencies:
80
94
  - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
83
125
  - !ruby/object:Gem::Dependency
84
126
  name: timecop
85
127
  requirement: !ruby/object:Gem::Requirement
@@ -130,6 +172,7 @@ extensions: []
130
172
  extra_rdoc_files: []
131
173
  files:
132
174
  - ".gitignore"
175
+ - ".rubocop.yml"
133
176
  - CHANGELOG.md
134
177
  - Gemfile
135
178
  - Gemfile.lock
@@ -150,7 +193,7 @@ metadata:
150
193
  allowed_push_host: https://rubygems.org
151
194
  homepage_uri: https://github.com/holysugar/omniauth-cloudiap
152
195
  source_code_uri: https://github.com/holysugar/omniauth-cloudiap
153
- post_install_message:
196
+ post_install_message:
154
197
  rdoc_options: []
155
198
  require_paths:
156
199
  - lib
@@ -165,9 +208,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
208
  - !ruby/object:Gem::Version
166
209
  version: '0'
167
210
  requirements: []
168
- rubyforge_project:
169
- rubygems_version: 2.7.6
170
- signing_key:
211
+ rubygems_version: 3.5.9
212
+ signing_key:
171
213
  specification_version: 4
172
214
  summary: omniauth strategy using Google Cloud IAP
173
215
  test_files: []