lib/bluekai/request.rb in bluekai-0.0.4 vs lib/bluekai/request.rb in bluekai-0.0.5
- old
+ new
@@ -18,10 +18,17 @@
fail "HTTP Request Error: #{response.body}" unless response.code.start_with?('2')
return :success if response.body.nil? || response.body.strip.empty?
JSON.parse(response.body, symbolize_names: true)
end
+ # HMAC-SHA256(Secret key, HTTP_METHOD + URI_PATH + QUERY_ARG_VALUES + POST_DATA)
+ def signature
+ digest = OpenSSL::Digest.new('sha256')
+ hmac = OpenSSL::HMAC.digest(digest, api_private_key, string_to_sign)
+ CGI.escape(Base64.strict_encode64(hmac))
+ end
+
private
attr_reader :method, :path, :query, :body, :domain
def http_request
@@ -40,19 +47,14 @@
def non_get_params
{ body: body_sorted, headers: json_headers }
end
def url
- "#{domain}#{path}?#{query_url_formatted}"\
- "bkuid=#{api_user_key}&bksig=#{signature}"
+ "#{domain}#{path}?#{query_string}"\
+ "&bkuid=#{api_user_key}&bksig=#{signature}"
end
- def query_values
- return nil unless query
- query.values.join
- end
-
def body_sorted
# sort hash according to keys for correct signature computation
body.sort_by { |key, _value| key.to_s }.to_h.to_json if body
end
@@ -61,22 +63,23 @@
'Accept' => 'application/json',
'Content-type' => 'application/json'
}
end
- def query_url_formatted
+ def query_values
return nil unless query
- query.map { |k, v| "#{k}=#{v}" }.join('&') + '&'
+ query_string.split('&').map { |p| p.split('=', 2)[1] }.join
end
- def string_to_sign
- method + path + query_values.to_s + body_sorted.to_s
+ def query_string(params = nil, prefix = '')
+ # converts a (nested) hash of query parameters into a query string.
+ (params || query || {})
+ .map { |k, v| v.is_a?(Hash) ? query_string(v, "#{k}=") : "#{prefix}#{k}=#{v}" }
+ .join('&')
end
- # HMAC-SHA256(Secret key, HTTP_METHOD + URI_PATH + QUERY_ARG_VALUES + POST_DATA)
- def signature
- digest = OpenSSL::Digest.new('sha256')
- hmac = OpenSSL::HMAC.digest(digest, api_private_key, string_to_sign)
- CGI.escape(Base64.strict_encode64(hmac))
+ def string_to_sign
+ # see the example here: https://kb.bluekai.com/display/PD/Programming+Example
+ method + path + query_values.to_s + body_sorted.to_s
end
end
end