class SoarAuthenticationToken::RemoteTokenValidator

Public Class Methods

new(configuration) click to toggle source
# File lib/soar_authentication_token/providers/remote_token_validator.rb, line 5
def initialize(configuration)
  @configuration = configuration
  set_configuration_defaults
  validate_configuration
end

Public Instance Methods

inject_store_provider(store_provider) click to toggle source
# File lib/soar_authentication_token/providers/remote_token_validator.rb, line 11
def inject_store_provider(store_provider)
  #ignore the store provider since this validator does not use a store
end
validate(authentication_token:, request_information:, flow_identifier:) click to toggle source
# File lib/soar_authentication_token/providers/remote_token_validator.rb, line 15
def validate(authentication_token:, request_information:, flow_identifier:)
  attempt = 0
  begin
    Timeout::timeout(@configuration['timeout']) do
      response = send_request(authentication_token,request_information,flow_identifier)
      validate_and_extract_information_from_response(response)
    end
  rescue Timeout::Error
    attempt += 1
    retry if attempt < @configuration['attempts']
    raise
  end
end

Private Instance Methods

rejection_result(reason:) click to toggle source
# File lib/soar_authentication_token/providers/remote_token_validator.rb, line 71
def rejection_result(reason:)
  [false, nil, reason]
end
send_request(authentication_token,request_information,flow_identifier) click to toggle source
# File lib/soar_authentication_token/providers/remote_token_validator.rb, line 36
def send_request(authentication_token,request_information,flow_identifier)
  uri = URI.parse(@configuration['validator-url'])
  uri.query = URI.encode_www_form( {'flow_identifier' => flow_identifier} )
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true if uri.is_a?(URI::HTTPS)
  request = Net::HTTP::Post.new(uri.request_uri)
  request.body = { 'authentication_token' => authentication_token,
                   'request_information' => request_information }.to_json
  http.request(request)
end
set_configuration_defaults() click to toggle source
# File lib/soar_authentication_token/providers/remote_token_validator.rb, line 31
def set_configuration_defaults
  @configuration['timeout'] ||= 3
  @configuration['attempts'] ||= 2
end
validate_and_extract_information_from_response(response) click to toggle source
# File lib/soar_authentication_token/providers/remote_token_validator.rb, line 47
def validate_and_extract_information_from_response(response)
  raise "Failure validating token with token validation service. Code #{response.code} received" if '200' != response.code
  body = JSON.parse(response.body)
  if ('success' == body['status']) and body['data']
    token_validity = body['data']['token_validity']
    token_meta = body['data']['token_meta']
    message = body['data']['notifications'].first
    raise 'Token validation service did not provide token_validity' if token_validity.nil?
    raise 'Token validation service did not provide token_meta' if token_validity and token_meta.nil?
    raise 'Token validation service did not provide message' if message.nil?
    return [token_validity, token_meta, message]
  end
  if 'fail' == body['status']
    return rejection_result(reason: 'remote validation failed')
  end
  raise "Failure validating token with token validation service. Status '#{body['status']}' received"
end
validate_configuration() click to toggle source
# File lib/soar_authentication_token/providers/remote_token_validator.rb, line 65
def validate_configuration
  raise "'validator-url' must be configured in remote mode" unless @configuration['validator-url']
  raise "'timeout' must be configured" unless @configuration['timeout']
  raise "'timeout' must be an integer" unless Integer(@configuration['timeout'])
end