class MSS::Core::Signers::Version3

@api private

Attributes

credentials[R]

@return [CredentialProviders::Provider]

Public Class Methods

new(credentials) click to toggle source

@param [CredentialProviders::Provider] credentials

# File lib/mss/core/signers/version_3.rb, line 25
def initialize credentials
  @credentials = credentials
end

Public Instance Methods

sign_request(req) click to toggle source

@param [Http::Request] req @return [Http::Request]

# File lib/mss/core/signers/version_3.rb, line 34
def sign_request req
  req.headers["x-amz-date"] ||= (req.headers["date"] ||= Time.now.httpdate)
  req.headers["host"] ||= req.host
  req.headers["x-amz-security-token"] = credentials.session_token if
    credentials.session_token
  req.headers["x-amzn-authorization"] =
    "MSS3 "+
    "AWSAccessKeyId=#{credentials.access_key_id},"+
    "Algorithm=HmacSHA256,"+
    "SignedHeaders=#{headers_to_sign(req).join(';')},"+
    "Signature=#{signature(req)}"
end

Private Instance Methods

canonical_headers(req) click to toggle source

@param [Http::Request] req

# File lib/mss/core/signers/version_3.rb, line 66
def canonical_headers req
  headers_to_sign(req).map do |name|
    value = req.headers[name]
    "#{name.downcase.strip}:#{value.strip}\n"
  end.sort.join
end
headers_to_sign(req) click to toggle source

@param [Http::Request] req

# File lib/mss/core/signers/version_3.rb, line 74
def headers_to_sign req
  req.headers.keys.select do |header|
      header == "host" ||
      header == "content-encoding" ||
      header =~ /^x-amz/
  end
end
signature(req, service_signing_name = nil) click to toggle source

@param [Http::Request] req

# File lib/mss/core/signers/version_3.rb, line 50
def signature req, service_signing_name = nil
  sign(credentials.secret_access_key, string_to_sign(req))
end
string_to_sign(req) click to toggle source

@param [Http::Request] req

# File lib/mss/core/signers/version_3.rb, line 55
def string_to_sign req
  OpenSSL::Digest::SHA256.digest([
    req.http_method,
    "/",
    "",
    canonical_headers(req),
    req.body
  ].join("\n"))
end