class IIJ::Sakagura::Core::Middleware::SignatureV2

Constants

SIGNATURE_KEY

Public Class Methods

new(app, options = {}) click to toggle source
Calls superclass method
# File lib/iij/sakagura/core/middleware/signature_v2.rb, line 11
def initialize(app, options = {})
  @access_key = options[:access_key]
  @secret_key = options[:secret_key]
  @expire_after = options[:expire_after] || 3600
  super(app)
end

Public Instance Methods

call(env) click to toggle source
# File lib/iij/sakagura/core/middleware/signature_v2.rb, line 18
def call(env)
  env[:body] = required_params.merge(env[:body])
  str = make_canonicalized_string(env)
  env[:body][SIGNATURE_KEY] = generate_signature(str)
  @app.call(env)
end
current_time() click to toggle source
# File lib/iij/sakagura/core/middleware/signature_v2.rb, line 25
def current_time
  Time.now
end
escape(str) click to toggle source
# File lib/iij/sakagura/core/middleware/signature_v2.rb, line 56
def escape(str)
  CGI.escape(str).gsub('+', '%20').gsub('%7E', '~')
end
generate_signature(str) click to toggle source
# File lib/iij/sakagura/core/middleware/signature_v2.rb, line 60
def generate_signature(str)
  digest_method = OpenSSL::Digest::SHA256.new
  digest = OpenSSL::HMAC.digest(digest_method, @secret_key, str)
  Base64.encode64(digest).chomp
end
make_canonicalized_string(env) click to toggle source
# File lib/iij/sakagura/core/middleware/signature_v2.rb, line 40
def make_canonicalized_string(env)
  url = env[:url]
  hh =
    if [80, 443].include? url.port
      url.host
    else
      "#{url.host}:#{url.port}"
    end
  [
   env[:method].upcase,
   hh,
   url.path,
   make_query_str(env[:body])
  ].join("\n")
end
make_query_str(params) click to toggle source
# File lib/iij/sakagura/core/middleware/signature_v2.rb, line 66
def make_query_str(params)
  params.sort_by{|k,v| k}.map{|k,v| escape(k.to_s) + "=" + escape(v.to_s) }.join('&')
end
required_params() click to toggle source
# File lib/iij/sakagura/core/middleware/signature_v2.rb, line 29
def required_params
  expire = current_time + @expire_after

  {
    "AccessKeyId" => @access_key,
    "SignatureVersion" => "2",
    "SignatureMethod" => "HmacSHA256",
    "Expire" => expire.utc.xmlschema
  }
end