Skip to content

Commit f513cbd

Browse files
committed
Add keyfinder mechanics
1 parent 6e0fc09 commit f513cbd

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

lib/jwt/encoded_token.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,14 @@ def payload
7575
#
7676
# @param algorithm [String, Array<String>, Object, Array<Object>] the algorithm(s) to use for verification.
7777
# @param key [String, Array<String>] the key(s) to use for verification.
78+
# @param key_finder [#call] an object responding to `call` to find the key for verification.
7879
# @return [nil]
7980
# @raise [JWT::VerificationError] if the signature verification fails.
80-
def verify_signature!(algorithm:, key:)
81+
# @raise [ArgumentError] if neither key nor key_finder is provided, or if both are provided.
82+
def verify_signature!(algorithm:, key: nil, key_finder: nil)
83+
raise ArgumentError, 'Provide either key or key_finder, not both or neither' if key.nil? == key_finder.nil?
84+
85+
key ||= key_finder.call(self)
8186
return if valid_signature?(algorithm: algorithm, key: key)
8287

8388
raise JWT::VerificationError, 'Signature verification failed'

spec/jwt/encoded_token_spec.rb

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
describe '#verify_signature!' do
2626
context 'when key is valid' do
27-
it 'returns nil' do
27+
it 'does not raise' do
2828
expect(token.verify_signature!(algorithm: 'HS256', key: 'secret')).to eq(nil)
2929
end
3030
end
@@ -34,6 +34,34 @@
3434
expect { token.verify_signature!(algorithm: 'HS256', key: 'wrong') }.to raise_error(JWT::VerificationError, 'Signature verification failed')
3535
end
3636
end
37+
38+
context 'when key is an array with one valid entry' do
39+
it 'does not raise' do
40+
expect(token.verify_signature!(algorithm: 'HS256', key: %w[wrong secret])).to eq(nil)
41+
end
42+
end
43+
44+
context 'when key_finder is given' do
45+
it 'uses key provided by keyfinder' do
46+
expect(token.verify_signature!(algorithm: 'HS256', key_finder: ->(_token) { 'secret' })).to eq(nil)
47+
end
48+
49+
it 'can utilize an array provided by keyfinder' do
50+
expect(token.verify_signature!(algorithm: 'HS256', key_finder: ->(_token) { %w[wrong secret] })).to eq(nil)
51+
end
52+
end
53+
54+
context 'when neither key or key_finder is given' do
55+
it 'raises an ArgumentError' do
56+
expect { token.verify_signature!(algorithm: 'HS256') }.to raise_error(ArgumentError, 'Provide either key or key_finder, not both or neither')
57+
end
58+
end
59+
60+
context 'when both key or key_finder is given' do
61+
it 'raises an ArgumentError' do
62+
expect { token.verify_signature!(algorithm: 'HS256', key: 'key', key_finder: 'finder') }.to raise_error(ArgumentError, 'Provide either key or key_finder, not both or neither')
63+
end
64+
end
3765
end
3866

3967
describe '#verify_claims!' do

0 commit comments

Comments
 (0)