class JWT::JWK::KeyFinder

Public Class Methods

new(options) click to toggle source
# File lib/jwt/jwk/key_finder.rb, line 6
def initialize(options)
  jwks_or_loader = options[:jwks]
  @jwks          = jwks_or_loader if jwks_or_loader.is_a?(Hash)
  @jwk_loader    = jwks_or_loader if jwks_or_loader.respond_to?(:call)
end

Public Instance Methods

key_for(kid) click to toggle source
# File lib/jwt/jwk/key_finder.rb, line 12
def key_for(kid)
  raise ::JWT::DecodeError, 'No key id (kid) found from token headers' unless kid

  jwk = resolve_key(kid)

  raise ::JWT::DecodeError, 'No keys found in jwks' if jwks_keys.empty?
  raise ::JWT::DecodeError, "Could not find public key for kid #{kid}" unless jwk

  ::JWT::JWK.import(jwk).keypair
end

Private Instance Methods

find_key(kid) click to toggle source
# File lib/jwt/jwk/key_finder.rb, line 53
def find_key(kid)
  jwks_keys.find { |key| (key[:kid] || key['kid']) == kid }
end
jwks() click to toggle source
# File lib/jwt/jwk/key_finder.rb, line 38
def jwks
  return @jwks if @jwks

  load_keys
  @jwks
end
jwks_keys() click to toggle source
# File lib/jwt/jwk/key_finder.rb, line 49
def jwks_keys
  Array(jwks[:keys] || jwks['keys'])
end
load_keys(opts = {}) click to toggle source
# File lib/jwt/jwk/key_finder.rb, line 45
def load_keys(opts = {})
  @jwks = @jwk_loader.call(opts)
end
reloadable?() click to toggle source
# File lib/jwt/jwk/key_finder.rb, line 57
def reloadable?
  @jwk_loader
end
resolve_key(kid) click to toggle source
# File lib/jwt/jwk/key_finder.rb, line 25
def resolve_key(kid)
  jwk = find_key(kid)

  return jwk if jwk

  if reloadable?
    load_keys(invalidate: true)
    return find_key(kid)
  end

  nil
end