ey-hmac 1.0.0 → 2.0.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.
- checksums.yaml +4 -4
- data/Gemfile +3 -4
- data/lib/ey-hmac/faraday.rb +3 -12
- data/lib/ey-hmac/version.rb +1 -1
- data/spec/faraday_spec.rb +30 -34
- data/spec/rack_spec.rb +25 -26
- data/spec/shared/authenticated.rb +14 -14
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8dfeeb93b92db1297b05223d6bb2b3e5aebc4baf
|
4
|
+
data.tar.gz: 4675e5002ad0686d6a819df058c6768110d442a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26a224b85612a8f673894612a5e0cc130a2f0dd0bccb0c945611bc2bc30c479b088cd7d19db3425ad09350c63f0c3e6e3b3304195239966dad760deccd8c33a4
|
7
|
+
data.tar.gz: b977ba7137c163af67c3c2a4c5eaf49f7f8e1e7ce11e9967fd07f3aa1d39a1e399bfd4aa77af2a7ca62f477803c5fc440e3630dd3ab555bda4dfaf1962433901
|
data/Gemfile
CHANGED
@@ -4,10 +4,10 @@ source 'https://rubygems.org'
|
|
4
4
|
gemspec
|
5
5
|
|
6
6
|
group(:test) do
|
7
|
-
gem 'rb-fsevent'
|
8
7
|
gem 'guard-bundler'
|
9
|
-
gem 'guard-rspec'
|
8
|
+
gem 'guard-rspec', '~> 4.2'
|
10
9
|
gem 'pry-nav'
|
10
|
+
gem 'rspec', '~> 2.99'
|
11
11
|
end
|
12
12
|
|
13
13
|
group(:rack) do
|
@@ -17,6 +17,5 @@ group(:rack) do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
group(:faraday) do
|
20
|
-
gem 'faraday'
|
21
|
-
gem 'faraday_middleware', "~> 0.9.0"
|
20
|
+
gem 'faraday', '~> 0.9.0'
|
22
21
|
end
|
data/lib/ey-hmac/faraday.rb
CHANGED
@@ -1,17 +1,8 @@
|
|
1
1
|
require 'ey-hmac'
|
2
2
|
require 'faraday'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
end
|
7
|
-
|
8
|
-
# Request middleware that performs HMAC request signing
|
9
|
-
require 'faraday_middleware/response_middleware'
|
10
|
-
|
11
|
-
class Ey::Hmac::Faraday < FaradayMiddleware::ResponseMiddleware
|
12
|
-
dependency do
|
13
|
-
require 'ey-hmac' unless defined?(Ey::Hmac)
|
14
|
-
end
|
4
|
+
class Ey::Hmac::Faraday < Faraday::Response::Middleware
|
5
|
+
dependency("ey-hmac")
|
15
6
|
|
16
7
|
attr_reader :key_id, :key_secret, :options
|
17
8
|
|
@@ -27,4 +18,4 @@ class Ey::Hmac::Faraday < FaradayMiddleware::ResponseMiddleware
|
|
27
18
|
end
|
28
19
|
end
|
29
20
|
|
30
|
-
Faraday::
|
21
|
+
Faraday::Middleware.register_middleware :hmac => Ey::Hmac::Faraday
|
data/lib/ey-hmac/version.rb
CHANGED
data/spec/faraday_spec.rb
CHANGED
@@ -18,19 +18,19 @@ describe "faraday" do
|
|
18
18
|
|
19
19
|
Ey::Hmac.sign!(request, key_id, key_secret, adapter: adapter)
|
20
20
|
|
21
|
-
request[:request_headers]['Authorization'].
|
22
|
-
request[:request_headers]['Content-Digest'].
|
23
|
-
Time.parse(request[:request_headers]['Date']).
|
21
|
+
expect(request[:request_headers]['Authorization']).to start_with("EyHmac")
|
22
|
+
expect(request[:request_headers]['Content-Digest']).to eq(Digest::MD5.hexdigest(request[:body]))
|
23
|
+
expect(Time.parse(request[:request_headers]['Date'])).not_to be_nil
|
24
24
|
|
25
25
|
yielded = false
|
26
26
|
|
27
|
-
Ey::Hmac.authenticated?(request, adapter: adapter) do |key_id|
|
28
|
-
key_id.
|
27
|
+
expect(Ey::Hmac.authenticated?(request, adapter: adapter) do |key_id|
|
28
|
+
expect(key_id).to eq(key_id)
|
29
29
|
yielded = true
|
30
30
|
key_secret
|
31
|
-
end.
|
31
|
+
end).to be_truthy
|
32
32
|
|
33
|
-
yielded.
|
33
|
+
expect(yielded).to be_truthy
|
34
34
|
end
|
35
35
|
|
36
36
|
it "should not set Content-Digest if body is nil" do
|
@@ -43,19 +43,19 @@ describe "faraday" do
|
|
43
43
|
|
44
44
|
Ey::Hmac.sign!(request, key_id, key_secret, adapter: adapter)
|
45
45
|
|
46
|
-
request[:request_headers]['Authorization'].
|
47
|
-
request[:request_headers].
|
48
|
-
Time.parse(request[:request_headers]['Date']).
|
46
|
+
expect(request[:request_headers]['Authorization']).to start_with("EyHmac")
|
47
|
+
expect(request[:request_headers]).not_to have_key('Content-Digest')
|
48
|
+
expect(Time.parse(request[:request_headers]['Date'])).not_to be_nil
|
49
49
|
|
50
50
|
yielded = false
|
51
51
|
|
52
|
-
Ey::Hmac.authenticated?(request, adapter: adapter) do |key_id|
|
53
|
-
key_id.
|
52
|
+
expect(Ey::Hmac.authenticated?(request, adapter: adapter) do |key_id|
|
53
|
+
expect(key_id).to eq(key_id)
|
54
54
|
yielded = true
|
55
55
|
key_secret
|
56
|
-
end.
|
56
|
+
end).to be_truthy
|
57
57
|
|
58
|
-
yielded.
|
58
|
+
expect(yielded).to be_truthy
|
59
59
|
end
|
60
60
|
|
61
61
|
it "should not set Content-Digest if body is empty" do
|
@@ -68,19 +68,19 @@ describe "faraday" do
|
|
68
68
|
|
69
69
|
Ey::Hmac.sign!(request, key_id, key_secret, adapter: adapter)
|
70
70
|
|
71
|
-
request[:request_headers]['Authorization'].
|
72
|
-
request[:request_headers].
|
73
|
-
Time.parse(request[:request_headers]['Date']).
|
71
|
+
expect(request[:request_headers]['Authorization']).to start_with("EyHmac")
|
72
|
+
expect(request[:request_headers]).not_to have_key('Content-Digest')
|
73
|
+
expect(Time.parse(request[:request_headers]['Date'])).not_to be_nil
|
74
74
|
|
75
75
|
yielded = false
|
76
76
|
|
77
|
-
Ey::Hmac.authenticated?(request, adapter: adapter) do |key_id|
|
78
|
-
key_id.
|
77
|
+
expect(Ey::Hmac.authenticated?(request, adapter: adapter) do |key_id|
|
78
|
+
expect(key_id).to eq(key_id)
|
79
79
|
yielded = true
|
80
80
|
key_secret
|
81
|
-
end.
|
81
|
+
end).to be_truthy
|
82
82
|
|
83
|
-
yielded.
|
83
|
+
expect(yielded).to be_truthy
|
84
84
|
end
|
85
85
|
|
86
86
|
context "with a request" do
|
@@ -108,13 +108,12 @@ describe "faraday" do
|
|
108
108
|
[(authenticated ? 200 : 401), {"Content-Type" => "text/plain"}, []]
|
109
109
|
end
|
110
110
|
|
111
|
-
request_env = nil
|
112
111
|
connection = Faraday.new do |c|
|
113
|
-
c.
|
112
|
+
c.use :hmac, key_id, key_secret, sign_with: :sha1
|
114
113
|
c.adapter(:rack, app)
|
115
114
|
end
|
116
115
|
|
117
|
-
connection.get("/resources").status.
|
116
|
+
expect(connection.get("/resources").status).to eq(200)
|
118
117
|
end
|
119
118
|
|
120
119
|
it "should accept a SHA256 signature" do # default
|
@@ -128,13 +127,12 @@ describe "faraday" do
|
|
128
127
|
[(authenticated ? 200 : 401), {"Content-Type" => "text/plain"}, []]
|
129
128
|
end
|
130
129
|
|
131
|
-
request_env = nil
|
132
130
|
connection = Faraday.new do |c|
|
133
|
-
c.
|
131
|
+
c.use :hmac, key_id, key_secret
|
134
132
|
c.adapter(:rack, app)
|
135
133
|
end
|
136
134
|
|
137
|
-
connection.get("/resources").status.
|
135
|
+
expect(connection.get("/resources").status).to eq(200)
|
138
136
|
end
|
139
137
|
|
140
138
|
it "should accept multiple digest signatures" do # default
|
@@ -148,13 +146,12 @@ describe "faraday" do
|
|
148
146
|
[(authenticated ? 200 : 401), {"Content-Type" => "text/plain"}, []]
|
149
147
|
end
|
150
148
|
|
151
|
-
request_env = nil
|
152
149
|
connection = Faraday.new do |c|
|
153
|
-
c.
|
150
|
+
c.use :hmac, key_id, key_secret
|
154
151
|
c.adapter(:rack, app)
|
155
152
|
end
|
156
153
|
|
157
|
-
connection.get("/resources").status.
|
154
|
+
expect(connection.get("/resources").status).to eq(200)
|
158
155
|
end
|
159
156
|
|
160
157
|
it "should sign empty request" do
|
@@ -174,18 +171,17 @@ describe "faraday" do
|
|
174
171
|
})
|
175
172
|
end
|
176
173
|
|
177
|
-
request_env = nil
|
178
174
|
connection = Faraday.new do |c|
|
179
|
-
c.
|
175
|
+
c.use :hmac, key_id, key_secret
|
180
176
|
c.adapter(:rack, app)
|
181
177
|
end
|
182
178
|
|
183
|
-
connection.get do |req|
|
179
|
+
expect(connection.get do |req|
|
184
180
|
req.path = "/resource"
|
185
181
|
req.body = nil
|
186
182
|
req.params = {"a" => "1"}
|
187
183
|
req.headers = {"Content-Type" => "application/x-www-form-urlencoded"}
|
188
|
-
end.status.
|
184
|
+
end.status).to eq(200)
|
189
185
|
end
|
190
186
|
end
|
191
187
|
end
|
data/spec/rack_spec.rb
CHANGED
@@ -16,19 +16,19 @@ describe "rack" do
|
|
16
16
|
)
|
17
17
|
Ey::Hmac.sign!(request, key_id, key_secret, adapter: adapter)
|
18
18
|
|
19
|
-
request.env['HTTP_AUTHORIZATION'].
|
20
|
-
request.env['HTTP_CONTENT_DIGEST'].
|
21
|
-
Time.parse(request.env['HTTP_DATE']).
|
19
|
+
expect(request.env['HTTP_AUTHORIZATION']).to start_with("EyHmac")
|
20
|
+
expect(request.env['HTTP_CONTENT_DIGEST']).to eq(Digest::MD5.hexdigest(request.body.tap(&:rewind).read))
|
21
|
+
expect(Time.parse(request.env['HTTP_DATE'])).not_to be_nil
|
22
22
|
|
23
23
|
yielded = false
|
24
24
|
|
25
|
-
Ey::Hmac.authenticated?(request, adapter: adapter) do |key_id|
|
26
|
-
key_id.
|
25
|
+
expect(Ey::Hmac.authenticated?(request, adapter: adapter) do |key_id|
|
26
|
+
expect(key_id).to eq(key_id)
|
27
27
|
yielded = true
|
28
28
|
key_secret
|
29
|
-
end.
|
29
|
+
end).to be_truthy
|
30
30
|
|
31
|
-
yielded.
|
31
|
+
expect(yielded).to be_truthy
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should not set Content-Digest if body is nil" do
|
@@ -38,19 +38,19 @@ describe "rack" do
|
|
38
38
|
|
39
39
|
Ey::Hmac.sign!(request, key_id, key_secret, adapter: adapter)
|
40
40
|
|
41
|
-
request.env['HTTP_AUTHORIZATION'].
|
42
|
-
request.env.
|
43
|
-
Time.parse(request.env['HTTP_DATE']).
|
41
|
+
expect(request.env['HTTP_AUTHORIZATION']).to start_with("EyHmac")
|
42
|
+
expect(request.env).not_to have_key('HTTP_CONTENT_DIGEST')
|
43
|
+
expect(Time.parse(request.env['HTTP_DATE'])).not_to be_nil
|
44
44
|
|
45
45
|
yielded = false
|
46
46
|
|
47
|
-
Ey::Hmac.authenticated?(request, adapter: adapter) do |key_id|
|
48
|
-
key_id.
|
47
|
+
expect(Ey::Hmac.authenticated?(request, adapter: adapter) do |key_id|
|
48
|
+
expect(key_id).to eq(key_id)
|
49
49
|
yielded = true
|
50
50
|
key_secret
|
51
|
-
end.
|
51
|
+
end).to be_truthy
|
52
52
|
|
53
|
-
yielded.
|
53
|
+
expect(yielded).to be_truthy
|
54
54
|
end
|
55
55
|
|
56
56
|
it "should not set Content-Digest if body is empty" do
|
@@ -61,19 +61,19 @@ describe "rack" do
|
|
61
61
|
|
62
62
|
Ey::Hmac.sign!(request, key_id, key_secret, adapter: adapter)
|
63
63
|
|
64
|
-
request.env['HTTP_AUTHORIZATION'].
|
65
|
-
request.env.
|
66
|
-
Time.parse(request.env['HTTP_DATE']).
|
64
|
+
expect(request.env['HTTP_AUTHORIZATION']).to start_with("EyHmac")
|
65
|
+
expect(request.env).not_to have_key('HTTP_CONTENT_DIGEST')
|
66
|
+
expect(Time.parse(request.env['HTTP_DATE'])).not_to be_nil
|
67
67
|
|
68
68
|
yielded = false
|
69
69
|
|
70
|
-
Ey::Hmac.authenticated?(request, adapter: adapter) do |key_id|
|
71
|
-
key_id.
|
70
|
+
expect(Ey::Hmac.authenticated?(request, adapter: adapter) do |key_id|
|
71
|
+
expect(key_id).to eq(key_id)
|
72
72
|
yielded = true
|
73
73
|
key_secret
|
74
|
-
end.
|
74
|
+
end).to be_truthy
|
75
75
|
|
76
|
-
yielded.
|
76
|
+
expect(yielded).to be_truthy
|
77
77
|
end
|
78
78
|
|
79
79
|
context "with a request" do
|
@@ -103,7 +103,7 @@ describe "rack" do
|
|
103
103
|
run app
|
104
104
|
end
|
105
105
|
|
106
|
-
client.get("/resource").status.
|
106
|
+
expect(client.get("/resource").status).to eq(200)
|
107
107
|
end
|
108
108
|
|
109
109
|
it "should accept a SHA256 signature" do # default
|
@@ -120,7 +120,7 @@ describe "rack" do
|
|
120
120
|
run app
|
121
121
|
end
|
122
122
|
|
123
|
-
client.get("/resource").status.
|
123
|
+
expect(client.get("/resource").status).to eq(200)
|
124
124
|
end
|
125
125
|
|
126
126
|
it "should accept multiple digest signatures" do # default
|
@@ -134,13 +134,12 @@ describe "rack" do
|
|
134
134
|
[(authenticated ? 200 : 401), {"Content-Type" => "text/plain"}, []]
|
135
135
|
end
|
136
136
|
|
137
|
-
request_env = nil
|
138
137
|
connection = Faraday.new do |c|
|
139
|
-
c.
|
138
|
+
c.use :hmac, key_id, key_secret, digest: [:sha1, :sha256]
|
140
139
|
c.adapter(:rack, app)
|
141
140
|
end
|
142
141
|
|
143
|
-
connection.get("/resources").status.
|
142
|
+
expect(connection.get("/resources").status).to eq(200)
|
144
143
|
end
|
145
144
|
end
|
146
145
|
end
|
@@ -3,23 +3,23 @@ shared_examples_for "authentication" do
|
|
3
3
|
it "should not authenticate invalid secret" do
|
4
4
|
Ey::Hmac.sign!(request, key_id, "#{key_secret}bad", adapter: adapter)
|
5
5
|
|
6
|
-
Ey::Hmac.authenticated?(request, adapter: adapter) do |auth_id|
|
6
|
+
expect(Ey::Hmac.authenticated?(request, adapter: adapter) do |auth_id|
|
7
7
|
(auth_id == key_id) && key_secret
|
8
|
-
end.
|
8
|
+
end).to be_falsey
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should not authenticate invalid id" do
|
12
12
|
Ey::Hmac.sign!(request, "what#{key_id}", key_secret, adapter: adapter)
|
13
13
|
|
14
|
-
Ey::Hmac.authenticated?(request, adapter: adapter) do |auth_id|
|
14
|
+
expect(Ey::Hmac.authenticated?(request, adapter: adapter) do |auth_id|
|
15
15
|
(auth_id == key_id) && key_secret
|
16
|
-
end.
|
16
|
+
end).to be_falsey
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should not authenticate missing header" do
|
20
|
-
Ey::Hmac.authenticated?(request, adapter: adapter) do |auth_id|
|
20
|
+
expect(Ey::Hmac.authenticated?(request, adapter: adapter) do |auth_id|
|
21
21
|
(auth_id == key_id) && key_secret
|
22
|
-
end.
|
22
|
+
end).to be_falsey
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -27,29 +27,29 @@ shared_examples_for "authentication" do
|
|
27
27
|
it "should not authenticate invalid secret" do
|
28
28
|
Ey::Hmac.sign!(request, key_id, "#{key_secret}bad", adapter: adapter)
|
29
29
|
|
30
|
-
|
30
|
+
expect {
|
31
31
|
Ey::Hmac.authenticate!(request, adapter: adapter) do |auth_id|
|
32
32
|
(auth_id == key_id) && key_secret
|
33
33
|
end
|
34
|
-
}.
|
34
|
+
}.to raise_exception(Ey::Hmac::SignatureMismatch)
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should not authenticate invalid id" do
|
38
38
|
Ey::Hmac.sign!(request, "what#{key_id}", key_secret, adapter: adapter)
|
39
39
|
|
40
|
-
|
40
|
+
expect {
|
41
41
|
Ey::Hmac.authenticate!(request, adapter: adapter) do |auth_id|
|
42
42
|
(auth_id == key_id) && key_secret
|
43
43
|
end
|
44
|
-
}.
|
44
|
+
}.to raise_exception(Ey::Hmac::MissingSecret)
|
45
45
|
end
|
46
46
|
|
47
47
|
it "should not authenticate missing header" do
|
48
|
-
|
49
|
-
Ey::Hmac.authenticate!(request, adapter: adapter) do |auth_id|
|
48
|
+
expect {
|
49
|
+
expect(Ey::Hmac.authenticate!(request, adapter: adapter) do |auth_id|
|
50
50
|
(auth_id == key_id) && key_secret
|
51
|
-
end.
|
52
|
-
}.
|
51
|
+
end).to be_falsey
|
52
|
+
}.to raise_exception(Ey::Hmac::MissingAuthorization)
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ey-hmac
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Lane & Jason Hansen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|