class Immobilienscout::Authenticator

Constants

ALLOWED_METHODS
HASH_DIGEST
OAUTH_SIGNATURE_METHOD
OAUTH_VERSION

Public Class Methods

new(url, method, query_params = nil) click to toggle source
# File lib/immobilienscout/authenticator.rb, line 12
def initialize(url, method, query_params = nil)
  @url = url
  @method = method
  @query_params = query_params

  raise ArgumentError unless valid?
end

Public Instance Methods

call() click to toggle source
# File lib/immobilienscout/authenticator.rb, line 20
def call
  header_params.merge!(@query_params) if @query_params
  auth_headers = auth_headers(header_params)

  auth_header_string(auth_headers)
end

Private Instance Methods

auth_header_string(params) click to toggle source
# File lib/immobilienscout/authenticator.rb, line 85
def auth_header_string(params)
  header_params = params.each_with_object(+'OAuth ') do |(key, value), header|
    header << "#{key}=#{value},"
  end
  header_params.chop
end
auth_headers(header_params) click to toggle source
# File lib/immobilienscout/authenticator.rb, line 79
def auth_headers(header_params)
  signature_base_string = signature_base_string(header_params)
  header_params['oauth_signature'] = generate_signature(signature_base_string)
  header_params
end
generate_nonce() click to toggle source
# File lib/immobilienscout/authenticator.rb, line 49
def generate_nonce
  Base64.encode64(random_bytes).gsub(/\W/, '')
end
generate_signature(signature_base_string) click to toggle source
# File lib/immobilienscout/authenticator.rb, line 65
def generate_signature(signature_base_string)
  url_encode(sign(signing_key, signature_base_string))
end
generate_timestamp() click to toggle source
# File lib/immobilienscout/authenticator.rb, line 57
def generate_timestamp
  Time.now.utc.to_i.to_s
end
header_params() click to toggle source
# File lib/immobilienscout/authenticator.rb, line 33
def header_params
  @header_params ||= {
    oauth_consumer_key: Immobilienscout.configuration.consumer_key,
    oauth_nonce: generate_nonce,
    oauth_signature_method: OAUTH_SIGNATURE_METHOD,
    oauth_timestamp: generate_timestamp,
    oauth_token: Immobilienscout.configuration.access_token,
    oauth_version: OAUTH_VERSION
  }
end
random_bytes(size = 7) click to toggle source
# File lib/immobilienscout/authenticator.rb, line 53
def random_bytes(size = 7)
  OpenSSL::Random.random_bytes(size)
end
sign(key, base_string) click to toggle source
# File lib/immobilienscout/authenticator.rb, line 73
def sign(key, base_string)
  digest = OpenSSL::Digest.new(HASH_DIGEST)
  hmac = OpenSSL::HMAC.digest(digest, key, base_string)
  Base64.encode64(hmac).chomp.delete(' ')
end
signature_base_string(params) click to toggle source
# File lib/immobilienscout/authenticator.rb, line 61
def signature_base_string(params)
  "#{@method}&#{url_encode(@url)}&#{url_encode(params.to_query)}"
end
signing_key() click to toggle source
# File lib/immobilienscout/authenticator.rb, line 44
def signing_key
  "#{url_encode(Immobilienscout.configuration.consumer_secret)}&"\
  "#{url_encode(Immobilienscout.configuration.access_token_secret)}"
end
url_encode(string) click to toggle source
# File lib/immobilienscout/authenticator.rb, line 69
def url_encode(string)
  CGI.escape(string)
end
valid?() click to toggle source
# File lib/immobilienscout/authenticator.rb, line 29
def valid?
  @url.present? && @method.present? && ALLOWED_METHODS.include?(@method)
end