class Trusona::Api::VerifiedResponse

a response from the Trusona API that can be verified with HMAC

Constants

LEGACY_SERVER_HEADER

Attributes

code[R]

Public Class Methods

new(unverified) click to toggle source
# File lib/trusona/api/verified_response.rb, line 11
def initialize(unverified)
  @unverified = unverified
  @code       = unverified.code
  @verified   = verify
end

Public Instance Methods

to_h() click to toggle source
# File lib/trusona/api/verified_response.rb, line 17
def to_h
  JSON.parse(@unverified.body)
rescue StandardError
  {}
end
verified?() click to toggle source
# File lib/trusona/api/verified_response.rb, line 23
def verified?
  @verified
end

Private Instance Methods

determine_content_type() click to toggle source
# File lib/trusona/api/verified_response.rb, line 63
def determine_content_type
  server = @unverified.headers['server']
  response_type = @unverified.headers['Content-Type']
  return response_type unless server == LEGACY_SERVER_HEADER

  determine_request_content_type
end
determine_request_content_type() click to toggle source
# File lib/trusona/api/verified_response.rb, line 71
def determine_request_content_type
  default_type = 'application/json;charset=utf-8'
  return default_type unless @unverified.request
  return default_type unless @unverified.request.options
  return default_type unless @unverified.request.options[:headers]

  @unverified.request.options[:headers]['Content-Type']
end
expected_signature() click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/trusona/api/verified_response.rb, line 36
def expected_signature
  begin
    message = Trusona::Api::HashedMessage.new(
      method: parse_method(@unverified.request.http_method),
      body: @unverified.body,
      content_type: determine_content_type,
      path: parse_path(@unverified.request.uri),
      date: parse_date(@unverified.headers)
    )
  rescue ArgumentError
    raise Trusona::SigningError
  end

  message.signature
end
parse_date(headers) click to toggle source
# File lib/trusona/api/verified_response.rb, line 59
def parse_date(headers)
  headers['X-Date'] || headers['x-date'] || headers['Date']
end
parse_method(method) click to toggle source
# File lib/trusona/api/verified_response.rb, line 80
def parse_method(method)
  method::METHOD
end
parse_path(uri) click to toggle source

rubocop:enable Metrics/MethodLength

# File lib/trusona/api/verified_response.rb, line 53
def parse_path(uri)
  return uri.path unless uri.query

  [uri.path, uri.query].join('?')
end
verify() click to toggle source
# File lib/trusona/api/verified_response.rb, line 29
def verify
  expected = expected_signature
  actual = @unverified.headers['X-Signature']
  actual == expected || actual == Base64.strict_decode64(expected)
end