http_signature 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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