Class: IIJ::Sakagura::Core::Middleware::SignatureV2

Inherits:
Faraday::Middleware
  • Object
show all
Defined in:
lib/iij/sakagura/core/middleware/signature_v2.rb

Constant Summary collapse

SIGNATURE_KEY =
"Signature".freeze

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ SignatureV2

Returns a new instance of SignatureV2.



12
13
14
15
16
17
# File 'lib/iij/sakagura/core/middleware/signature_v2.rb', line 12

def initialize(app, options = {})
  @access_key = options[:access_key]
  @secret_key = options[:secret_key]
  @expire_after = options[:expire_after] || 3600
  super(app)
end

Instance Method Details

#call(env) ⇒ Object



19
20
21
22
23
24
# File 'lib/iij/sakagura/core/middleware/signature_v2.rb', line 19

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_timeObject



26
27
28
# File 'lib/iij/sakagura/core/middleware/signature_v2.rb', line 26

def current_time
  Time.now
end

#escape(str) ⇒ Object



57
58
59
# File 'lib/iij/sakagura/core/middleware/signature_v2.rb', line 57

def escape(str)
  CGI.escape(str).gsub('+', '%20').gsub('%7E', '~')
end

#generate_signature(str) ⇒ Object



61
62
63
64
65
# File 'lib/iij/sakagura/core/middleware/signature_v2.rb', line 61

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) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/iij/sakagura/core/middleware/signature_v2.rb', line 41

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) ⇒ Object



67
68
69
# File 'lib/iij/sakagura/core/middleware/signature_v2.rb', line 67

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_paramsObject



30
31
32
33
34
35
36
37
38
39
# File 'lib/iij/sakagura/core/middleware/signature_v2.rb', line 30

def required_params
  expire = current_time + @expire_after

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