Sha256: bacb317ba98a1032f59f6d5ecb325c7d50485452f9bed19bae636b83987c6724

Contents?: true

Size: 1.07 KB

Versions: 3

Compression:

Stored size: 1.07 KB

Contents

# frozen_string_literal: true

module KeycloakRack
  # Read the bearer token from the `Authorization` token.
  #
  # @api private
  class ReadToken
    include Dry::Monads[:result]

    include Import[config: "keycloak-rack.config"]

    # The pattern to match bearer tokens with.
    BEARER_TOKEN = /\ABearer (?<token>.+)\z/i.freeze

    # @param [Hash, #[]] env
    # @return [Dry::Monads::Success(String)] when a token is found
    # @return [Dry::Monads::Success(nil)] when a token is not found, but unauthenticated requests are allowed
    # @return [Dry::Monads::Failure(:no_token, String)]
    def call(env)
      found_token = read_from env

      return Success(found_token) if found_token.present?

      return Success(nil) if config.allow_anonymous?

      Failure[:no_token, "No JWT provided"]
    end

    private

    # @param [Hash] env the rack environment
    # @option env [String] "HTTP_AUTHORIZATION" the Authorization header
    # @return [String, nil]
    def read_from(env)
      match = BEARER_TOKEN.match env["HTTP_AUTHORIZATION"]

      match&.[](:token)
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
keycloak_rack-1.1.1 lib/keycloak_rack/read_token.rb
keycloak_rack-1.1.0 lib/keycloak_rack/read_token.rb
keycloak_rack-1.0.0 lib/keycloak_rack/read_token.rb