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.
5 6 7 8 9 10 11 12 13 14 |
# File 'lib/ibanity/http_signature.rb', line 5 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
42 43 44 45 46 |
# File 'lib/ibanity/http_signature.rb', line 42 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
52 53 54 |
# File 'lib/ibanity/http_signature.rb', line 52 def date @date ||= Time.now.utc.iso8601 end |
#header_value(header) ⇒ Object
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/ibanity/http_signature.rb', line 65 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
28 29 30 31 32 33 34 35 |
# File 'lib/ibanity/http_signature.rb', line 28 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
48 49 50 |
# File 'lib/ibanity/http_signature.rb', line 48 def host @uri.host end |
#payload_digest ⇒ Object
16 17 18 19 20 21 22 |
# File 'lib/ibanity/http_signature.rb', line 16 def payload_digest digest = OpenSSL::Digest::SHA512.new string_payload = @payload.nil? ? "" : @payload digest.update(string_payload) base64 = Base64.urlsafe_encode64(digest.digest) "SHA-512=#{base64}" end |
#request_target ⇒ Object
37 38 39 40 |
# File 'lib/ibanity/http_signature.rb', line 37 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
24 25 26 |
# File 'lib/ibanity/http_signature.rb', line 24 def signature_algorithm @certificate.signature_algorithm.match("sha256") ? "rsa-sha256" : "rsa-sha512" end |
#signature_headers ⇒ Object
81 82 83 84 85 86 87 |
# File 'lib/ibanity/http_signature.rb', line 81 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
56 57 58 59 60 61 62 63 |
# File 'lib/ibanity/http_signature.rb', line 56 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 |