Skip to content

Commit a2558d4

Browse files
authored
Merge pull request #125 from moskyb/main
Raise an error when JWK::Set::Fetcher fetches something that's not a JWKS
2 parents 9160130 + 715037a commit a2558d4

File tree

3 files changed

+24
-9
lines changed

3 files changed

+24
-9
lines changed

lib/json/jwk/set.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,4 @@ def as_json(options = {})
3131
end
3232
end
3333
end
34-
end
34+
end

lib/json/jwk/set/fetcher.rb

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ module JSON
22
class JWK
33
class Set
44
module Fetcher
5+
class MalformedJWKSet < JWT::Exception; end
6+
57
class Cache
68
def fetch(cache_key, options = {})
79
yield
@@ -65,13 +67,15 @@ def self.fetch(jwks_uri, kid:, auto_detect: true, **options)
6567
kid
6668
].collect(&:to_s).join(':')
6769

68-
jwks = Set.new(
69-
JSON.parse(
70-
cache.fetch(cache_key, options) do
71-
http_client.get(jwks_uri).body
72-
end
73-
)
70+
parsed_jwks = JSON.parse(
71+
cache.fetch(cache_key, options) do
72+
http_client.get(jwks_uri).body
73+
end
7474
)
75+
76+
raise MalformedJWKSet, "Malformed JWK Set: #{parsed_jwks.inspect}" unless parsed_jwks.is_a?(Hash) && parsed_jwks['keys'].is_a?(Array)
77+
78+
jwks = Set.new(parsed_jwks)
7579
cache.delete(cache_key, options) if jwks[kid].blank?
7680

7781
if auto_detect
@@ -83,4 +87,4 @@ def self.fetch(jwks_uri, kid:, auto_detect: true, **options)
8387
end
8488
end
8589
end
86-
end
90+
end

spec/json/jwk/set/fetcher_spec.rb

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
describe JSON::JWK::Set::Fetcher::Cache do
55
let(:something) { SecureRandom.hex(32) }
66

7-
it 'just execute givne block' do
7+
it 'just execute given block' do
88
expect(
99
subject.fetch('cache_key') do
1010
something
@@ -111,6 +111,17 @@ def delete(cache_key)
111111
end.to request_to jwks_uri
112112
end
113113

114+
context "when the JWKS uri returns a structure that's not a valid JWK Set" do
115+
it "raises a JSON::JWK::Set::Fetcher::MalformedJWKSet error" do
116+
stub_request(:get, jwks_uri).to_return(
117+
status: 200,
118+
body: '"hello there"' # Note that this is valid JSON, but not a valid JWK Set
119+
)
120+
121+
expect { subject }.to raise_error(JSON::JWK::Set::Fetcher::MalformedJWKSet)
122+
end
123+
end
124+
114125
context 'when unknown' do
115126
let(:kid) { 'unknown' }
116127
let(:cache_key) do

0 commit comments

Comments
 (0)