Sha256: 310b7d3018b7b9d618f0ef7e6b695b01f3b087526c1a486d74742804fcddac6b

Contents?: true

Size: 1.61 KB

Versions: 2

Compression:

Stored size: 1.61 KB

Contents

# frozen_string_literal: true

module KeycloakRack
  # Wrap the result of {KeycloakRack::DecodeAndVerify#call} in a class that
  # provides a unified interface for introspecting a Keycloak JWT.
  class WrapToken
    include Dry::Monads[:result]

    # @param [Hash] payload
    # @param [Hash] headers
    # @return [Dry::Monads::Success(KeycloakRack::DecodedToken)]
    def call(payload, headers)
      raw_attributes = payload.merge(original_payload: payload, headers: headers)

      Success DecodedToken.new raw_attributes
    rescue Dry::Struct::Error => e
      handle_struct_error e
    rescue StandardError => e
      unknown_failure e
    end

    private

    # @param [Dry::Struct::Error] error
    # @return [Dry::Monads::Failure]
    def handle_struct_error(error)
      cause = error.cause

      case cause
      when Dry::Types::MissingKeyError
        claim = KeycloakRack::DecodedToken.maybe_unalias_key cause.key

        wrap_failure "Missing expected JWT claim: #{claim}", error
      when Dry::Types::SchemaError, Dry::Types::ConstraintError
        # :nocov:
        wrap_failure "Unexpected issue with JWT claim types", error
        # :nocov:
      else
        # :nocov:
        unknown_failure error
        # :nocov:
      end
    end

    # @param [Exception] error
    # @return [Dry::Monads::Failure]
    def unknown_failure(error)
      wrap_failure "An unknown error occurred when decoding the token", error
    end

    # @param [String] message
    # @param [Exception] error
    # @return [Dry::Monads::Failure]
    def wrap_failure(message, error)
      Failure[:decoding_failed, message, error]
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
keycloak_rack-1.1.1 lib/keycloak_rack/wrap_token.rb
keycloak_rack-1.1.0 lib/keycloak_rack/wrap_token.rb