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, "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 48
def find_key(kid)
  Array(jwks[:keys]).find { |key| key[:kid] == kid }
end
jwks() click to toggle source
# File lib/jwt/jwk/key_finder.rb, line 37
def jwks
  return @jwks if @jwks

  load_keys
  @jwks
end
load_keys(opts = {}) click to toggle source
# File lib/jwt/jwk/key_finder.rb, line 44
def load_keys(opts = {})
  @jwks = @jwk_loader.call(opts)
end
reloadable?() click to toggle source
# File lib/jwt/jwk/key_finder.rb, line 52
def reloadable?
  @jwk_loader
end
resolve_key(kid) click to toggle source
# File lib/jwt/jwk/key_finder.rb, line 24
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