Skip to content

Commit

Permalink
Count verifications done with #valid_signature?
Browse files Browse the repository at this point in the history
  • Loading branch information
anakinj committed Dec 29, 2024
1 parent 95dc43f commit 9e6c4d8
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 6 deletions.
10 changes: 5 additions & 5 deletions lib/jwt/encoded_token.rb
Original file line number Diff line number Diff line change
Expand Up @@ -125,10 +125,8 @@ def verify_signature!(algorithm:, key: nil, key_finder: nil)

key ||= key_finder.call(self)

if valid_signature?(algorithm: algorithm, key: key)
@signature_verified = true
return
end
return if valid_signature?(algorithm: algorithm, key: key)

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

Expand All @@ -138,11 +136,13 @@ def verify_signature!(algorithm:, key: nil, key_finder: nil)
# @param key [String, Array<String>] the key(s) to use for verification.
# @return [Boolean] true if the signature is valid, false otherwise.
def valid_signature?(algorithm:, key:)
Array(JWA.resolve_and_sort(algorithms: algorithm, preferred_algorithm: header['alg'])).any? do |algo|
valid = Array(JWA.resolve_and_sort(algorithms: algorithm, preferred_algorithm: header['alg'])).any? do |algo|
Array(key).any? do |one_key|
algo.verify(data: signing_input, signature: signature, verification_key: one_key)
end
end

valid.tap { |verified| @signature_verified = verified }
end

# Verifies the claims of the token.
Expand Down
16 changes: 15 additions & 1 deletion spec/jwt/encoded_token_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,26 @@
end

describe '#payload' do
context 'when token is verified' do
context 'when token is verified using #verify_signature!' do
before { token.verify_signature!(algorithm: 'HS256', key: 'secret') }

it { expect(token.payload).to eq(payload) }
end

context 'when token is checked using #valid_signature?' do
before { token.valid_signature?(algorithm: 'HS256', key: 'secret') }

it { expect(token.payload).to eq(payload) }
end

context 'when token is verified using #valid_signature? but is not valid' do
before { token.valid_signature?(algorithm: 'HS256', key: 'wrong') }

it 'raises an error' do
expect { token.payload }.to raise_error(JWT::DecodeError, 'Verify the token signature before accessing the payload')
end
end

context 'when token is not verified' do
it 'raises an error' do
expect { token.payload }.to raise_error(JWT::DecodeError, 'Verify the token signature before accessing the payload')
Expand Down

0 comments on commit 9e6c4d8

Please sign in to comment.