Class: Ibanity::HttpSignature
- Inherits:
-
Object
- Object
- Ibanity::HttpSignature
- Defined in:
- lib/ibanity/http_signature.rb
Instance Method Summary collapse
- #base64_signature ⇒ Object
- #date ⇒ Object
- #header_value(header) ⇒ Object
- #headers_to_sign ⇒ Object
- #host ⇒ Object
-
#initialize(certificate:, certificate_id:, key:, method:, uri:, query_params:, headers:, payload:) ⇒ HttpSignature
constructor
A new instance of HttpSignature.
- #payload_digest ⇒ Object
- #request_target ⇒ Object
- #signature_algorithm ⇒ Object
- #signature_headers ⇒ Object
- #signing_string ⇒ Object
Constructor Details
#initialize(certificate:, certificate_id:, key:, method:, uri:, query_params:, headers:, payload:) ⇒ HttpSignature
Returns a new instance of HttpSignature.
3 4 5 6 7 8 9 10 11 12 |
# File 'lib/ibanity/http_signature.rb', line 3 def initialize(certificate:, certificate_id:, key:, method:, uri:, query_params:, headers:, payload:) @certificate = certificate @certificate_id = certificate_id @key = key @method = method @uri = URI(uri) @headers = headers @payload = payload @query_params = query_params end |
Instance Method Details
#base64_signature ⇒ Object
40 41 42 43 44 |
# File 'lib/ibanity/http_signature.rb', line 40 def base64_signature digest = signature_algorithm == "rsa-sha256" ? OpenSSL::Digest::SHA256.new : OpenSSL::Digest::SHA512.new signature = @key.sign(digest, signing_string) Base64.urlsafe_encode64(signature) end |
#date ⇒ Object
50 51 52 |
# File 'lib/ibanity/http_signature.rb', line 50 def date @date ||= Time.now.utc.iso8601 end |
#header_value(header) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/ibanity/http_signature.rb', line 63 def header_value(header) case header when "(request-target)" request_target when "host" host when "digest" payload_digest when "date" date else camelized_header = header.split("-").collect(&:capitalize).join("-") @headers[camelized_header] end end |
#headers_to_sign ⇒ Object
26 27 28 29 30 31 32 33 |
# File 'lib/ibanity/http_signature.rb', line 26 def headers_to_sign result = ["(request-target)", "host", "digest", "date"] result << "authorization" unless @headers["Authorization"].nil? @headers.keys.each do |header| result << header.to_s.downcase if header.to_s.match(/ibanity/i) end result end |
#host ⇒ Object
46 47 48 |
# File 'lib/ibanity/http_signature.rb', line 46 def host @uri.host end |
#payload_digest ⇒ Object
14 15 16 17 18 19 20 |
# File 'lib/ibanity/http_signature.rb', line 14 def payload_digest digest = OpenSSL::Digest::SHA512.new string_payload = @payload.nil? ? "" : @payload.to_json digest.update(string_payload) base64 = Base64.urlsafe_encode64(digest.digest) "SHA-512=#{base64}" end |
#request_target ⇒ Object
35 36 37 38 |
# File 'lib/ibanity/http_signature.rb', line 35 def request_target @uri.query = URI.encode_www_form(URI.decode_www_form(@uri.query.to_s).concat(@query_params.to_a)) if @query_params&.keys&.any? "#{@method} #{@uri.request_uri}" end |
#signature_algorithm ⇒ Object
22 23 24 |
# File 'lib/ibanity/http_signature.rb', line 22 def signature_algorithm @certificate.signature_algorithm.match("sha256") ? "rsa-sha256" : "rsa-sha512" end |
#signature_headers ⇒ Object
79 80 81 82 83 84 85 |
# File 'lib/ibanity/http_signature.rb', line 79 def signature_headers { "Date" => date, "Digest" => payload_digest, "Signature" => "keyId=\"#{@certificate_id}\" algorithm=\"#{signature_algorithm}\" headers=\"#{headers_to_sign.join(" ")}\" signature=\"#{base64_signature}\"" } end |
#signing_string ⇒ Object
54 55 56 57 58 59 60 61 |
# File 'lib/ibanity/http_signature.rb', line 54 def signing_string result = [] headers_to_sign.each do |header_to_sign| value = header_value(header_to_sign) result << "#{header_to_sign}: #{value}" end result.join("\n") end |