warden-hmac-authentication 0.5.5 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/warden-hmac-authentication +12 -64
- data/lib/hmac/signer.rb +61 -44
- data/lib/hmac/string/jruby.rb +2 -2
- metadata +75 -24
@@ -1,68 +1,16 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'warden-hmac-authentication' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
2
8
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
puts ""
|
7
|
-
puts ""
|
8
|
-
puts "============= ERROR ================"
|
9
|
-
puts ""
|
10
|
-
puts "You need trollop installed or in your gemfile to use the signer"
|
11
|
-
puts ""
|
12
|
-
puts "============= ERROR ================"
|
13
|
-
puts ""
|
14
|
-
puts ""
|
15
|
-
exit(-1)
|
16
|
-
end
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
17
12
|
|
18
|
-
require '
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
19
15
|
|
20
|
-
|
21
|
-
|
22
|
-
version "warden-hmac-sign 0.3.0 (c) 2011 Felix Gilcher, Florian Gilcher"
|
23
|
-
banner <<-EOS
|
24
|
-
warden-hmac-authentication is used to create and validate signed urls for
|
25
|
-
usage with the HMAC authentication scheme used by
|
26
|
-
https://github.com/Asquera/warden-hmac-authentication
|
27
|
-
|
28
|
-
Usage:
|
29
|
-
warden-hmac-authentication [options] <command> url
|
30
|
-
|
31
|
-
where command is one of
|
32
|
-
|
33
|
-
sign: signs the given url
|
34
|
-
validate: validates the given url
|
35
|
-
|
36
|
-
and where [options] are:
|
37
|
-
|
38
|
-
EOS
|
39
|
-
|
40
|
-
opt :algorithm, "The hashing algorithm to use for the HMAC", :type => :string, :default => "sha1"
|
41
|
-
opt :secret, "The shared secret for the HMAC", :type => :string, :required => true
|
42
|
-
opt :"auth-param", "The name for the auth param in the url", :default => "auth"
|
43
|
-
opt :"date", "The date to use for the signature (defaults to now)"
|
44
|
-
end
|
45
|
-
|
46
|
-
cmd = ARGV.shift
|
47
|
-
Trollop::die "You must give a command" if cmd.nil?
|
48
|
-
Trollop::die "You command must be one of [sign, validate]" unless ["sign", "validate"].include? cmd
|
49
|
-
Trollop::die "You must provide a URL" if ARGV.empty?
|
50
|
-
url = ARGV.shift
|
51
|
-
|
52
|
-
secret = opts.delete(:secret)
|
53
|
-
algorithm = opts.delete(:algorithm)
|
54
|
-
|
55
|
-
signer = HMAC::Signer.new(algorithm)
|
56
|
-
|
57
|
-
if "sign" == cmd
|
58
|
-
puts signer.sign_url(url, secret, opts)
|
59
|
-
else
|
60
|
-
success = signer.validate_url_signature(url, secret, opts)
|
61
|
-
if success
|
62
|
-
puts "URL #{url} is valid"
|
63
|
-
exit 0
|
64
|
-
else
|
65
|
-
puts "URL #{url} does not contain a valid signature"
|
66
|
-
exit 1
|
67
|
-
end
|
68
|
-
end
|
16
|
+
load Gem.bin_path('warden-hmac-authentication', 'warden-hmac-authentication')
|
data/lib/hmac/signer.rb
CHANGED
@@ -12,6 +12,17 @@ module HMAC
|
|
12
12
|
class Signer
|
13
13
|
attr_accessor :secret, :algorithm, :default_opts
|
14
14
|
|
15
|
+
DEFAULT_OPTS = {
|
16
|
+
:auth_scheme => "HMAC",
|
17
|
+
:auth_param => "auth",
|
18
|
+
:auth_header => "Authorization",
|
19
|
+
:auth_header_format => "%{auth_scheme} %{signature}",
|
20
|
+
:query_based => false,
|
21
|
+
:use_alternate_date_header => false,
|
22
|
+
:extra_auth_params => {},
|
23
|
+
:ignore_params => []
|
24
|
+
}
|
25
|
+
|
15
26
|
# create a new HMAC instance
|
16
27
|
#
|
17
28
|
# @param [String] algorithm The hashing-algorithm to use. See the openssl documentation for valid values.
|
@@ -25,25 +36,18 @@ module HMAC
|
|
25
36
|
# @option default_opts [String] :alternate_date_header ('X-#{auth_scheme}-Date') The header name for the alternate date header
|
26
37
|
# @option default_opts [Bool] :query_based (false) Whether to use query based authentication
|
27
38
|
# @option default_opts [Bool] :use_alternate_date_header (false) Use the alternate date header instead of `Date`
|
39
|
+
# @option default_opts [Hash] :extra_auth_params ({}) Additional parameters to inject in the auth parameter
|
40
|
+
# @option default_opts [Array<Symbol>] :ignore_params ([]) Params to ignore for signing
|
28
41
|
#
|
29
42
|
def initialize(algorithm = "sha1", default_opts = {})
|
30
43
|
self.algorithm = algorithm
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
:auth_header => "Authorization",
|
35
|
-
:auth_header_format => "%{auth_scheme} %{signature}",
|
36
|
-
:nonce_header => "X-%{scheme}-Nonce" % {:scheme => (default_opts[:auth_scheme] || "HMAC")},
|
37
|
-
:alternate_date_header => "X-%{scheme}-Date" % {:scheme => (default_opts[:auth_scheme] || "HMAC")},
|
38
|
-
:query_based => false,
|
39
|
-
:use_alternate_date_header => false,
|
40
|
-
:extra_auth_params => {}
|
41
|
-
}.merge(default_opts)
|
42
|
-
|
44
|
+
default_opts[:nonce_header] ||="X-%{scheme}-Nonce" % {:scheme => (default_opts[:auth_scheme] || "HMAC")}
|
45
|
+
default_opts[:alternate_date_header] ||= "X-%{scheme}-Date" % {:scheme => (default_opts[:auth_scheme] || "HMAC")}
|
46
|
+
self.default_opts = DEFAULT_OPTS.merge(default_opts)
|
43
47
|
end
|
44
|
-
|
48
|
+
|
45
49
|
# Generate the signature from a hash representation
|
46
|
-
#
|
50
|
+
#
|
47
51
|
# returns nil if no secret or an empty secret was given
|
48
52
|
#
|
49
53
|
# @param [Hash] params the parameters to create the representation with
|
@@ -57,6 +61,7 @@ module HMAC
|
|
57
61
|
# @option params [String] :auth_scheme ('HMAC') The name of the authorization scheme used in the Authorization header and to construct various header-names
|
58
62
|
# @option params [String] :auth_param ('auth') The name of the authentication param to use for query based authentication
|
59
63
|
# @option params [Hash] :extra_auth_params ({}) Additional parameters to inject in the auth parameter
|
64
|
+
# @option params [Array<Symbol>] :ignore_params ([]) Params to ignore for signing
|
60
65
|
# @option params [String] :auth_header ('Authorization') The name of the authorization header to use
|
61
66
|
# @option params [String] :auth_header_format ('%{auth_scheme} %{signature}') The format of the authorization header. Will be interpolated with the given options and the signature.
|
62
67
|
# @option params [String] :nonce_header ('X-#{auth_scheme}-Nonce') The header name for the request nonce
|
@@ -67,7 +72,7 @@ module HMAC
|
|
67
72
|
# @return [String] the signature
|
68
73
|
def generate_signature(params)
|
69
74
|
secret = params.delete(:secret)
|
70
|
-
|
75
|
+
|
71
76
|
# jruby stumbles over empty secrets, we regard them as invalid anyways, so we return an empty digest if no scret was given
|
72
77
|
if '' == secret.to_s
|
73
78
|
nil
|
@@ -75,7 +80,7 @@ module HMAC
|
|
75
80
|
OpenSSL::HMAC.hexdigest(algorithm, secret, canonical_representation(params))
|
76
81
|
end
|
77
82
|
end
|
78
|
-
|
83
|
+
|
79
84
|
# compares the given signature with the signature created from a hash representation
|
80
85
|
#
|
81
86
|
# @param [String] signature the signature to compare with
|
@@ -90,6 +95,7 @@ module HMAC
|
|
90
95
|
# @option params [String] :auth_scheme ('HMAC') The name of the authorization scheme used in the Authorization header and to construct various header-names
|
91
96
|
# @option params [String] :auth_param ('auth') The name of the authentication param to use for query based authentication
|
92
97
|
# @option params [Hash] :extra_auth_params ({}) Additional parameters to inject in the auth parameter
|
98
|
+
# @option params [Array<Symbol>] :ignore_params ([]) Params to ignore for signing
|
93
99
|
# @option params [String] :auth_header ('Authorization') The name of the authorization header to use
|
94
100
|
# @option params [String] :auth_header_format ('%{auth_scheme} %{signature}') The format of the authorization header. Will be interpolated with the given options and the signature.
|
95
101
|
# @option params [String] :nonce_header ('X-#{auth_scheme}-Nonce') The header name for the request nonce
|
@@ -101,7 +107,7 @@ module HMAC
|
|
101
107
|
def validate_signature(signature, params)
|
102
108
|
signature == generate_signature(params)
|
103
109
|
end
|
104
|
-
|
110
|
+
|
105
111
|
# convienience method to check the signature of a url with query-based authentication
|
106
112
|
#
|
107
113
|
# @param [String] url the url to test
|
@@ -114,18 +120,20 @@ module HMAC
|
|
114
120
|
def validate_url_signature(url, secret, opts = {})
|
115
121
|
opts = default_opts.merge(opts)
|
116
122
|
opts[:query_based] = true
|
117
|
-
|
123
|
+
|
118
124
|
uri = Addressable::URI.parse(url)
|
119
125
|
query_values = uri.query_values
|
120
126
|
auth_params = query_values.delete(opts[:auth_param])
|
121
|
-
|
127
|
+
|
128
|
+
return false unless auth_params
|
129
|
+
|
122
130
|
date = auth_params["date"]
|
123
131
|
nonce = auth_params["nonce"]
|
124
132
|
validate_signature(auth_params["signature"], :secret => secret, :method => "GET", :path => uri.path, :date => date, :nonce => nonce, :query => query_values, :headers => {})
|
125
133
|
end
|
126
|
-
|
134
|
+
|
127
135
|
# generates the canonical representation for a given request
|
128
|
-
#
|
136
|
+
#
|
129
137
|
# @param [Hash] params the parameters to create the representation with
|
130
138
|
# @option params [String] :method The HTTP Verb of the request
|
131
139
|
# @option params [String] :date The date of the request as it was formatted in the request
|
@@ -136,6 +144,7 @@ module HMAC
|
|
136
144
|
# @option params [String] :auth_scheme ('HMAC') The name of the authorization scheme used in the Authorization header and to construct various header-names
|
137
145
|
# @option params [String] :auth_param ('auth') The name of the authentication param to use for query based authentication
|
138
146
|
# @option params [Hash] :extra_auth_params ({}) Additional parameters to inject in the auth parameter
|
147
|
+
# @option params [Array<Symbol>] :ignore_params ([]) Params to ignore for signing
|
139
148
|
# @option params [String] :auth_header ('Authorization') The name of the authorization header to use
|
140
149
|
# @option params [String] :auth_header_format ('%{auth_scheme} %{signature}') The format of the authorization header. Will be interpolated with the given options and the signature.
|
141
150
|
# @option params [String] :nonce_header ('X-#{auth_scheme}-Nonce') The header name for the request nonce
|
@@ -146,20 +155,20 @@ module HMAC
|
|
146
155
|
# @return [String] the canonical representation
|
147
156
|
def canonical_representation(params)
|
148
157
|
rep = ""
|
149
|
-
|
150
|
-
rep << "#{params[:method].upcase}\n"
|
158
|
+
|
159
|
+
rep << "#{params[:method].upcase}\n"
|
151
160
|
rep << "date:#{params[:date]}\n"
|
152
161
|
rep << "nonce:#{params[:nonce]}\n"
|
153
|
-
|
162
|
+
|
154
163
|
(params[:headers] || {}).sort.each do |pair|
|
155
164
|
name,value = *pair
|
156
165
|
rep << "#{name.downcase}:#{value}\n"
|
157
166
|
end
|
158
|
-
|
167
|
+
|
159
168
|
rep << params[:path]
|
160
|
-
|
169
|
+
|
161
170
|
p = (params[:query] || {}).dup
|
162
|
-
|
171
|
+
|
163
172
|
if !p.empty?
|
164
173
|
query = p.sort.map do |key, value|
|
165
174
|
"%{key}=%{value}" % {
|
@@ -169,10 +178,10 @@ module HMAC
|
|
169
178
|
end.join("&")
|
170
179
|
rep << "?#{query}"
|
171
180
|
end
|
172
|
-
|
181
|
+
|
173
182
|
rep
|
174
183
|
end
|
175
|
-
|
184
|
+
|
176
185
|
# sign the given request
|
177
186
|
#
|
178
187
|
# @param [String] url The url of the request
|
@@ -183,10 +192,11 @@ module HMAC
|
|
183
192
|
# @option opts [String, #strftime] :date (Time.now) The date to use in the signature
|
184
193
|
# @option opts [Hash] :headers ({}) A list of optional headers to include in the signature
|
185
194
|
# @option opts [String,Symbol] :method ('GET') The HTTP method to use in the signature
|
186
|
-
#
|
195
|
+
#
|
187
196
|
# @option opts [String] :auth_scheme ('HMAC') The name of the authorization scheme used in the Authorization header and to construct various header-names
|
188
197
|
# @option opts [String] :auth_param ('auth') The name of the authentication param to use for query based authentication
|
189
198
|
# @option opts [Hash] :extra_auth_params ({}) Additional parameters to inject in the auth parameter
|
199
|
+
# @option opts [Array<Symbol>] :ignore_params ([]) Params to ignore for signing
|
190
200
|
# @option opts [String] :auth_header ('Authorization') The name of the authorization header to use
|
191
201
|
# @option opts [String] :auth_header_format ('%{auth_scheme} %{signature}') The format of the authorization header. Will be interpolated with the given options and the signature.
|
192
202
|
# @option opts [String] :nonce_header ('X-#{auth_scheme}-Nonce') The header name for the request nonce
|
@@ -196,41 +206,49 @@ module HMAC
|
|
196
206
|
#
|
197
207
|
def sign_request(url, secret, opts = {})
|
198
208
|
opts = default_opts.merge(opts)
|
199
|
-
|
209
|
+
|
200
210
|
uri = Addressable::URI.parse(url)
|
201
211
|
headers = opts[:headers] || {}
|
202
|
-
|
212
|
+
|
203
213
|
date = opts[:date] || Time.now.gmtime
|
204
214
|
date = date.gmtime.strftime('%a, %e %b %Y %T GMT') if date.respond_to? :strftime
|
205
215
|
|
206
216
|
method = opts[:method] ? opts[:method].to_s.upcase : "GET"
|
207
|
-
|
208
|
-
|
209
|
-
|
217
|
+
|
218
|
+
query_values = uri.query_values
|
219
|
+
|
220
|
+
if query_values
|
221
|
+
query_values.delete_if do |k,v|
|
222
|
+
opts[:ignore_params].one? { |param| (k == param) || (k == param.to_s) }
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
signature = generate_signature(:secret => secret, :method => method, :path => uri.path, :date => date, :nonce => opts[:nonce], :query => query_values, :headers => opts[:headers], :ignore_params => opts[:ignore_params])
|
227
|
+
|
210
228
|
if opts[:query_based]
|
211
229
|
auth_params = opts[:extra_auth_params].merge({
|
212
230
|
"date" => date,
|
213
231
|
"signature" => signature
|
214
232
|
})
|
215
233
|
auth_params[:nonce] = opts[:nonce] unless opts[:nonce].nil?
|
216
|
-
|
234
|
+
|
217
235
|
query_values = uri.query_values || {}
|
218
236
|
query_values[opts[:auth_param]] = auth_params
|
219
237
|
uri.query_values = query_values
|
220
238
|
else
|
221
239
|
headers[opts[:auth_header]] = opts[:auth_header_format] % opts.merge({:signature => signature})
|
222
240
|
headers[opts[:nonce_header]] = opts[:nonce] unless opts[:nonce].nil?
|
223
|
-
|
224
|
-
if opts[:use_alternate_date_header]
|
241
|
+
|
242
|
+
if opts[:use_alternate_date_header]
|
225
243
|
headers[opts[:alternate_date_header]] = date
|
226
244
|
else
|
227
245
|
headers["Date"] = date
|
228
246
|
end
|
229
247
|
end
|
230
|
-
|
248
|
+
|
231
249
|
[headers, uri.to_s]
|
232
250
|
end
|
233
|
-
|
251
|
+
|
234
252
|
# convienience method to sign a url for use with query-based authentication
|
235
253
|
#
|
236
254
|
# @param [String] url the url to sign
|
@@ -244,11 +262,10 @@ module HMAC
|
|
244
262
|
def sign_url(url, secret, opts = {})
|
245
263
|
opts = default_opts.merge(opts)
|
246
264
|
opts[:query_based] = true
|
247
|
-
|
265
|
+
|
248
266
|
headers, url = *sign_request(url, secret, opts)
|
249
|
-
url
|
267
|
+
url
|
250
268
|
end
|
251
|
-
|
252
|
-
|
269
|
+
|
253
270
|
end
|
254
271
|
end
|
data/lib/hmac/string/jruby.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# this is a ruby workaround for jruby issue http://jira.codehaus.org/browse/JRUBY-5338
|
1
|
+
# this is a ruby workaround for jruby issue http://jira.codehaus.org/browse/JRUBY-5338 which was fixed in jruby-1.6.6
|
2
2
|
|
3
|
-
if defined?(JRUBY_VERSION) && RUBY_VERSION =~ /^1\.9/
|
3
|
+
if defined?(JRUBY_VERSION) && RUBY_VERSION =~ /^1\.9/ && JRUBY_VERSION < "1.6.6"
|
4
4
|
class KeyError < IndexError
|
5
5
|
end
|
6
6
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: warden-hmac-authentication
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-04-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: addressable
|
17
|
-
requirement:
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,15 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements:
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
26
31
|
- !ruby/object:Gem::Dependency
|
27
32
|
name: rack
|
28
|
-
requirement:
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
29
34
|
none: false
|
30
35
|
requirements:
|
31
36
|
- - ! '>='
|
@@ -33,10 +38,15 @@ dependencies:
|
|
33
38
|
version: '0'
|
34
39
|
type: :runtime
|
35
40
|
prerelease: false
|
36
|
-
version_requirements:
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
37
47
|
- !ruby/object:Gem::Dependency
|
38
48
|
name: warden
|
39
|
-
requirement:
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
40
50
|
none: false
|
41
51
|
requirements:
|
42
52
|
- - ! '>='
|
@@ -44,10 +54,15 @@ dependencies:
|
|
44
54
|
version: '0'
|
45
55
|
type: :runtime
|
46
56
|
prerelease: false
|
47
|
-
version_requirements:
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
48
63
|
- !ruby/object:Gem::Dependency
|
49
64
|
name: rake
|
50
|
-
requirement:
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
51
66
|
none: false
|
52
67
|
requirements:
|
53
68
|
- - ! '>='
|
@@ -55,10 +70,15 @@ dependencies:
|
|
55
70
|
version: '0'
|
56
71
|
type: :development
|
57
72
|
prerelease: false
|
58
|
-
version_requirements:
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
59
79
|
- !ruby/object:Gem::Dependency
|
60
80
|
name: rack-test
|
61
|
-
requirement:
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
62
82
|
none: false
|
63
83
|
requirements:
|
64
84
|
- - ! '>='
|
@@ -66,10 +86,15 @@ dependencies:
|
|
66
86
|
version: '0'
|
67
87
|
type: :development
|
68
88
|
prerelease: false
|
69
|
-
version_requirements:
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
70
95
|
- !ruby/object:Gem::Dependency
|
71
96
|
name: riot
|
72
|
-
requirement:
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
73
98
|
none: false
|
74
99
|
requirements:
|
75
100
|
- - ! '>='
|
@@ -77,10 +102,15 @@ dependencies:
|
|
77
102
|
version: '0'
|
78
103
|
type: :development
|
79
104
|
prerelease: false
|
80
|
-
version_requirements:
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
81
111
|
- !ruby/object:Gem::Dependency
|
82
112
|
name: timecop
|
83
|
-
requirement:
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
84
114
|
none: false
|
85
115
|
requirements:
|
86
116
|
- - ! '>='
|
@@ -88,10 +118,15 @@ dependencies:
|
|
88
118
|
version: '0'
|
89
119
|
type: :development
|
90
120
|
prerelease: false
|
91
|
-
version_requirements:
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
92
127
|
- !ruby/object:Gem::Dependency
|
93
128
|
name: simplecov
|
94
|
-
requirement:
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
95
130
|
none: false
|
96
131
|
requirements:
|
97
132
|
- - ! '>='
|
@@ -99,10 +134,15 @@ dependencies:
|
|
99
134
|
version: '0'
|
100
135
|
type: :development
|
101
136
|
prerelease: false
|
102
|
-
version_requirements:
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
139
|
+
requirements:
|
140
|
+
- - ! '>='
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
103
143
|
- !ruby/object:Gem::Dependency
|
104
144
|
name: simplecov-html
|
105
|
-
requirement:
|
145
|
+
requirement: !ruby/object:Gem::Requirement
|
106
146
|
none: false
|
107
147
|
requirements:
|
108
148
|
- - ! '>='
|
@@ -110,10 +150,15 @@ dependencies:
|
|
110
150
|
version: '0'
|
111
151
|
type: :development
|
112
152
|
prerelease: false
|
113
|
-
version_requirements:
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
155
|
+
requirements:
|
156
|
+
- - ! '>='
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
114
159
|
- !ruby/object:Gem::Dependency
|
115
160
|
name: trollop
|
116
|
-
requirement:
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
117
162
|
none: false
|
118
163
|
requirements:
|
119
164
|
- - ! '>='
|
@@ -121,7 +166,12 @@ dependencies:
|
|
121
166
|
version: '0'
|
122
167
|
type: :development
|
123
168
|
prerelease: false
|
124
|
-
version_requirements:
|
169
|
+
version_requirements: !ruby/object:Gem::Requirement
|
170
|
+
none: false
|
171
|
+
requirements:
|
172
|
+
- - ! '>='
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
125
175
|
description: ! "This gem provides request authentication via [HMAC](http://en.wikipedia.org/wiki/Hmac).
|
126
176
|
The main usage is request based, noninteractive\n authentication for API implementations.
|
127
177
|
Two strategies are supported that differ mainly in how the authentication information
|
@@ -147,7 +197,8 @@ files:
|
|
147
197
|
- lib/hmac/strategies/header.rb
|
148
198
|
- lib/hmac/strategies/query.rb
|
149
199
|
- lib/hmac/string/jruby.rb
|
150
|
-
-
|
200
|
+
- !binary |-
|
201
|
+
YmluL3dhcmRlbi1obWFjLWF1dGhlbnRpY2F0aW9u
|
151
202
|
homepage: https://github.com/Asquera/warden-hmac-authentication
|
152
203
|
licenses: []
|
153
204
|
post_install_message:
|
@@ -168,7 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
219
|
version: '0'
|
169
220
|
requirements: []
|
170
221
|
rubyforge_project:
|
171
|
-
rubygems_version: 1.8.
|
222
|
+
rubygems_version: 1.8.21
|
172
223
|
signing_key:
|
173
224
|
specification_version: 3
|
174
225
|
summary: Provides request based, non-interactive authentication for APIs
|