http_signature 0.0.4 → 0.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 6320c8fac16dd162425c863e231bd09f61813b2e9ee5106e793c2eae062a08fc
4
- data.tar.gz: 86297b14149a73e71075280e8d0cd832ef5af322789aa55a8b729f5aec3d6834
2
+ SHA1:
3
+ metadata.gz: 6e856db84d163534a1f63dda575f6638f3a0a176
4
+ data.tar.gz: a0f25862111f95abf82f598902f928acfd62d3e5
5
5
  SHA512:
6
- metadata.gz: f7da7985ac3900b7422143ecff5cda1bcc78eb4ae3f4b750bf74c296dc41f2b5411e45dbd0e5d7aebc548c782d400889f46b2be4497ba36a5cdc370133d335fe
7
- data.tar.gz: 393d8df6ded354f2d96cea732bb3017e16c0801f6a94f3e749ec56aee5d7752bac754d6ae76705ae6801ea4fb761a391923eafd50616c663339e69627b4da026
6
+ metadata.gz: 3a9b3e8636cc8c1689c47016fcfe271b4b2bca8bf618045894750efa695295ead602a33daa75b085647b8cf7a2d2833eba158d2bffb562bb4fdca94c4d81cbe6
7
+ data.tar.gz: 68027c22824a7d0468e57d287d00f5fd087861c03ca9637e356630d5f7f9cc0e498a6011d7e3600c24af9d17a1ba2cf930bf87c71d5d6a38b86b4f6a11c48aae
@@ -0,0 +1 @@
1
+ 2.4.0
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- http_signature (0.0.4)
4
+ http_signature (0.0.5)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -18,7 +18,7 @@ require 'http_signature'
18
18
  ```
19
19
 
20
20
  ### Basic
21
- The most basic usage without any extra headers. The default algorithm is `hmac-sha256`.
21
+ The most basic usage without any extra headers. The default algorithm is `hmac-sha256`. This create the `Signature` header value. Next step is to add the value to the header and 💥 you're done!
22
22
  ```ruby
23
23
  HTTPSignature.create(
24
24
  url: 'https://example.com/foo',
@@ -110,7 +110,7 @@ HTTPSignature.valid?(
110
110
  Example of using it on an outgoing request.
111
111
  ```ruby
112
112
  require 'http_signature/faraday'
113
- # Two variables needed to be set
113
+
114
114
  HTTPSignature::Faraday.key = 'MySecureKey' # This should be long and random
115
115
  HTTPSignature::Faraday.key_id = 'key-1' # For the recipient to know which key to decrypt with
116
116
 
@@ -123,6 +123,11 @@ end
123
123
 
124
124
  # Now this request will contain the `Signature` header
125
125
  response = conn.get('/')
126
+
127
+ # Request looking like:
128
+ # GET / HTTP/1.1
129
+ # User-Agent: Faraday v0.15.0
130
+ # Signature: keyId="key-1",algorithm="hmac-sha256",headers="(request-target) date",signature="EzFa4vb0z+VFF8VYt9qQlzF9MTf5Izptc02OJ7aajnU="
126
131
  ```
127
132
 
128
133
  ### Rack middleware for incoming requests
@@ -134,6 +139,8 @@ Sinatra for example
134
139
  require 'http_signature/rack'
135
140
 
136
141
  HTTPSignature.config(keys: [{ id: 'key-1', value: 'MySecureKey' }])
142
+ # You can exclude paths where you don't want to validate the signature:
143
+ HTTPSignature::Rack.exclude_paths = ['/']
137
144
 
138
145
  use HTTPSignature::Rack
139
146
  run MyApp
@@ -142,14 +149,17 @@ run MyApp
142
149
  #### Rails
143
150
  Checkout [this documentation](http://guides.rubyonrails.org/rails_on_rack.html). But in short, add this inside the config block:
144
151
  ```ruby
152
+ require 'http_signature/rack' # This doesn't have to be inside the block
145
153
  config.middleware.use HTTPSignature::Rack
146
154
  ```
147
155
 
148
- and don't forget to set the key env somewhere, an initializer should be suitable:
156
+ Don't forget to set the keys somewhere, an initializer should be suitable. Multiple keys
157
+ are supported to be able to easily be rotated.
149
158
  ```ruby
150
159
  HTTPSignature.config(keys: [{ id: 'key-1', value: 'MySecureKey' }])
151
160
  ```
152
161
 
162
+
153
163
  ## Development
154
164
  Install dependencies and then you can start running the tests!
155
165
  ```
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = 'http_signature'
6
- spec.version = '0.0.4'
6
+ spec.version = '0.0.5'
7
7
  spec.authors = ['Joel Larsson']
8
8
  spec.email = ['bolmaster2@gmail.com']
9
9
 
@@ -11,9 +11,14 @@ class HTTPSignature::Faraday < Faraday::Middleware
11
11
  def call(env)
12
12
  raise 'key and key_id needs to be set' if self.class.key.nil? || self.class.key_id.nil?
13
13
 
14
- if env[:body]
15
- env[:request_headers].merge!('Digest' => HTTPSignature.create_digest(env[:body]))
16
- end
14
+ body =
15
+ if env[:body] && env[:body].respond_to?(:read)
16
+ string = env[:body].read
17
+ env[:body].rewind
18
+ string
19
+ else
20
+ env[:body].to_s
21
+ end
17
22
 
18
23
  # Choose which headers to sign
19
24
  filtered_headers = %w{ Host Date Digest }
@@ -26,7 +31,7 @@ class HTTPSignature::Faraday < Faraday::Middleware
26
31
  key: self.class.key,
27
32
  key_id: self.class.key_id,
28
33
  algorithm: 'hmac-sha256',
29
- body: env[:body] ? env[:body] : ''
34
+ body: body
30
35
  )
31
36
 
32
37
  env[:request_headers].merge!('Signature' => signature)
@@ -4,28 +4,38 @@ require 'http_signature'
4
4
 
5
5
  # Rack middleware using http-signature gem to validate signature on every incoming request
6
6
  class HTTPSignature::Rack
7
+ class << self
8
+ attr_accessor :exclude_paths
9
+ end
10
+
7
11
  def initialize(app)
8
12
  @app = app
13
+ self.class.exclude_paths ||= []
9
14
  end
10
15
 
11
16
  def call(env)
12
17
  request = Rack::Request.new(env)
18
+
19
+ return @app.call(env) if path_excluded?(request.path)
20
+
13
21
  return [401, {}, ['No signature header']] unless request.get_header("HTTP_SIGNATURE")
14
22
 
15
- request_body = request.body.gets
16
- request_headers = parse_request_headers(request)
17
23
  begin
24
+ request_body = request.body.read
25
+ request_headers = parse_request_headers(request)
18
26
  parsed_signature = parse_signature(request_headers)
27
+ key = HTTPSignature.key(parsed_signature['keyId'])
19
28
  rescue
20
29
  return [401, {}, ['Invalid signature :(']]
21
30
  end
31
+
22
32
  headers_to_sign = request_headers.select { |k, v| parsed_signature['headers'].include?(k) }
23
33
 
24
34
  params = {
25
35
  url: request.path,
26
36
  method: request.request_method,
27
37
  headers: headers_to_sign,
28
- key: HTTPSignature.key(parsed_signature['keyId']),
38
+ key: key,
29
39
  key_id: parsed_signature['keyId'],
30
40
  algorithm: parsed_signature['algorithm'],
31
41
  body: request_body ? request_body : '',
@@ -67,4 +77,8 @@ class HTTPSignature::Rack
67
77
  [k, v.tr('"', '')]
68
78
  end.to_h
69
79
  end
80
+
81
+ def path_excluded?(path)
82
+ self.class.exclude_paths.include?(path)
83
+ end
70
84
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http_signature
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Larsson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-30 00:00:00.000000000 Z
11
+ date: 2018-05-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -75,6 +75,7 @@ extra_rdoc_files: []
75
75
  files:
76
76
  - ".circleci/config.yml"
77
77
  - ".gitignore"
78
+ - ".ruby-version"
78
79
  - Gemfile
79
80
  - Gemfile.lock
80
81
  - README.md
@@ -103,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
104
  version: '0'
104
105
  requirements: []
105
106
  rubyforge_project:
106
- rubygems_version: 2.7.3
107
+ rubygems_version: 2.6.8
107
108
  signing_key:
108
109
  specification_version: 4
109
110
  summary: Create and validate HTTP request signature