api-auth 2.2.0 → 2.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +11 -52
  3. data/.rubocop_todo.yml +92 -0
  4. data/.travis.yml +15 -14
  5. data/CHANGELOG.md +28 -0
  6. data/Gemfile +1 -1
  7. data/README.md +77 -38
  8. data/VERSION +1 -1
  9. data/api_auth.gemspec +15 -11
  10. data/gemfiles/http2.gemfile +7 -0
  11. data/gemfiles/http3.gemfile +7 -0
  12. data/gemfiles/http4.gemfile +7 -0
  13. data/gemfiles/rails_5.gemfile +5 -7
  14. data/gemfiles/rails_51.gemfile +5 -5
  15. data/gemfiles/rails_52.gemfile +9 -0
  16. data/gemfiles/rails_60.gemfile +11 -0
  17. data/lib/api_auth.rb +3 -0
  18. data/lib/api_auth/base.rb +2 -2
  19. data/lib/api_auth/headers.rb +19 -8
  20. data/lib/api_auth/railtie.rb +9 -5
  21. data/lib/api_auth/request_drivers/action_controller.rb +1 -0
  22. data/lib/api_auth/request_drivers/faraday.rb +2 -1
  23. data/lib/api_auth/request_drivers/grape_request.rb +87 -0
  24. data/lib/api_auth/request_drivers/http.rb +96 -0
  25. data/lib/api_auth/request_drivers/httpi.rb +1 -0
  26. data/lib/api_auth/request_drivers/net_http.rb +1 -1
  27. data/lib/api_auth/request_drivers/rack.rb +1 -0
  28. data/lib/api_auth/request_drivers/rest_client.rb +3 -2
  29. data/spec/api_auth_spec.rb +7 -0
  30. data/spec/headers_spec.rb +26 -8
  31. data/spec/request_drivers/action_controller_spec.rb +10 -4
  32. data/spec/request_drivers/action_dispatch_spec.rb +17 -11
  33. data/spec/request_drivers/curb_spec.rb +9 -3
  34. data/spec/request_drivers/faraday_spec.rb +6 -0
  35. data/spec/request_drivers/grape_request_spec.rb +279 -0
  36. data/spec/request_drivers/http_spec.rb +190 -0
  37. data/spec/request_drivers/httpi_spec.rb +6 -0
  38. data/spec/request_drivers/net_http_spec.rb +6 -0
  39. data/spec/request_drivers/rack_spec.rb +6 -0
  40. data/spec/request_drivers/rest_client_spec.rb +93 -15
  41. data/spec/spec_helper.rb +3 -4
  42. metadata +102 -66
  43. data/gemfiles/rails_4.gemfile +0 -11
  44. data/gemfiles/rails_41.gemfile +0 -11
  45. data/gemfiles/rails_42.gemfile +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 51fee150bf8e85fbaa3195608e96a25ad4ef7cb19bcc026137c1831c94f652c1
4
- data.tar.gz: 7c0aeeefdf36f93e53cef4ac76f0015efa587c5a7b572dafe6670276d786e92a
3
+ metadata.gz: 60f6b22c31a0167767c8aa90d9e831bde874fd6831798d1c1a5104849005a4f4
4
+ data.tar.gz: 9be6acbac2c38e6fc0d0af33d6ba9fd6f9bc4ca0dc5dc6050fee1a8e139d94b5
5
5
  SHA512:
6
- metadata.gz: 4cf7349cdbed677337b82e3c0ad87ce1271ce0a92c65a9bda8514dadde6c3a6fd40e962fc9b23cb937e0b1b804d456930d6ddeb245d5d3d5ed021639c077a3c8
7
- data.tar.gz: c4935420257b03f3f90460c7caffb64d0da2792f9793c24c02bf00e7abdc1a80a509d73c3ed86a95098de3cb5aaeb96776e383a537dfab3233fd043a6077c928
6
+ metadata.gz: 30f33a8543297ceb7e99bb028cca8377e5af639957d9edc06e36f1968d252a0012357030e726d9ff7024ebc99da30e9a1bb324eba686ffb6c784931ac2063620
7
+ data.tar.gz: 00b796d683a878643d152f8bad511f38d92fcf6182e941eff490609b5f122b301b08c8820af7229b9a5b744414ded4069054523244bba571a1bc408da6b4ba06
@@ -1,63 +1,22 @@
1
- # This configuration was generated by
2
- # `rubocop --auto-gen-config`
3
- # on 2016-02-10 17:06:30 +0100 using RuboCop version 0.37.1.
4
- # The point is for the user to remove these configuration records
5
- # one by one as the offenses are removed from the code base.
6
- # Note that changes in the inspected code, or installation of new
7
- # versions of RuboCop, may require this file to be generated again.
1
+ inherit_from: .rubocop_todo.yml
8
2
 
9
- # Offense count: 1
10
- # Configuration parameters: AllowSafeAssignment.
11
- Lint/AssignmentInCondition:
12
- Exclude:
13
- - 'lib/api_auth/base.rb'
3
+ AllCops:
4
+ TargetRubyVersion: 2.4
14
5
 
15
- # Offense count: 2
16
6
  Metrics/AbcSize:
17
7
  Max: 25
18
8
 
19
- # Offense count: 2
20
- Metrics/CyclomaticComplexity:
21
- Max: 13
22
-
23
- # Offense count: 74
24
- # Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
9
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
25
10
  # URISchemes: http, https
26
- Metrics/LineLength:
27
- Max: 137
11
+ Layout/LineLength:
12
+ Max: 140
28
13
 
29
- # Offense count: 4
30
- # Configuration parameters: CountComments.
31
14
  Metrics/MethodLength:
32
- Max: 30
33
-
34
- # Offense count: 1
35
- Metrics/PerceivedComplexity:
36
- Max: 8
37
-
38
- # Offense count: 8
39
- Style/AccessorMethodName:
40
- Exclude:
41
- - 'lib/api_auth/railtie.rb'
42
- - 'lib/api_auth/request_drivers/action_controller.rb'
43
- - 'lib/api_auth/request_drivers/curb.rb'
44
- - 'lib/api_auth/request_drivers/faraday.rb'
45
- - 'lib/api_auth/request_drivers/httpi.rb'
46
- - 'lib/api_auth/request_drivers/net_http.rb'
47
- - 'lib/api_auth/request_drivers/rack.rb'
48
- - 'lib/api_auth/request_drivers/rest_client.rb'
49
-
50
- # Offense count: 4
51
- Style/Documentation:
52
- Exclude:
53
- - 'spec/**/*'
54
- - 'test/**/*'
55
- - 'lib/api_auth/railtie.rb'
56
- - 'lib/api_auth/request_drivers/rest_client.rb'
15
+ Max: 40
57
16
 
58
- # Offense count: 1
59
- # Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts.
60
- Style/FileName:
17
+ Naming/FileName:
61
18
  Exclude:
62
19
  - 'lib/api-auth.rb'
63
- - 'Appraisals'
20
+
21
+ Style/FrozenStringLiteralComment:
22
+ Enabled: false
@@ -0,0 +1,92 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2018-10-22 20:30:52 +0700 using RuboCop version 0.59.2.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ # Cop supports --auto-correct.
11
+ # Configuration parameters: Include, TreatCommentsAsGroupSeparators.
12
+ # Include: **/*.gemspec
13
+ Gemspec/OrderedDependencies:
14
+ Exclude:
15
+ - 'api_auth.gemspec'
16
+
17
+ # Offense count: 1
18
+ # Configuration parameters: AllowSafeAssignment.
19
+ Lint/AssignmentInCondition:
20
+ Exclude:
21
+ - 'lib/api_auth/base.rb'
22
+
23
+ # Offense count: 9
24
+ # Configuration parameters: CheckForMethodsWithNoSideEffects.
25
+ Lint/Void:
26
+ Exclude:
27
+ - 'lib/api_auth/headers.rb'
28
+ - 'lib/api_auth/request_drivers/action_controller.rb'
29
+ - 'lib/api_auth/request_drivers/curb.rb'
30
+ - 'lib/api_auth/request_drivers/faraday.rb'
31
+ - 'lib/api_auth/request_drivers/grape_request.rb'
32
+ - 'lib/api_auth/request_drivers/httpi.rb'
33
+ - 'lib/api_auth/request_drivers/net_http.rb'
34
+ - 'lib/api_auth/request_drivers/rack.rb'
35
+ - 'lib/api_auth/request_drivers/rest_client.rb'
36
+
37
+ # Offense count: 1
38
+ # Configuration parameters: CountComments, ExcludedMethods.
39
+ # ExcludedMethods: refine
40
+ Metrics/BlockLength:
41
+ Max: 27
42
+
43
+ # Offense count: 1
44
+ Metrics/CyclomaticComplexity:
45
+ Max: 15
46
+
47
+ # Offense count: 1
48
+ Metrics/PerceivedComplexity:
49
+ Max: 8
50
+
51
+ # Offense count: 10
52
+ Naming/AccessorMethodName:
53
+ Exclude:
54
+ - 'lib/api_auth/railtie.rb'
55
+ - 'lib/api_auth/request_drivers/action_controller.rb'
56
+ - 'lib/api_auth/request_drivers/curb.rb'
57
+ - 'lib/api_auth/request_drivers/faraday.rb'
58
+ - 'lib/api_auth/request_drivers/grape_request.rb'
59
+ - 'lib/api_auth/request_drivers/http.rb'
60
+ - 'lib/api_auth/request_drivers/httpi.rb'
61
+ - 'lib/api_auth/request_drivers/net_http.rb'
62
+ - 'lib/api_auth/request_drivers/rack.rb'
63
+ - 'lib/api_auth/request_drivers/rest_client.rb'
64
+
65
+ # Offense count: 3
66
+ # Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames.
67
+ # AllowedNames: io, id, to, by, on, in, at, ip, db
68
+ Naming/MethodParameterName:
69
+ Exclude:
70
+ - 'lib/api_auth/base.rb'
71
+ - 'spec/railtie_spec.rb'
72
+
73
+ # Offense count: 1
74
+ # Configuration parameters: EnforcedStyle.
75
+ # SupportedStyles: inline, group
76
+ Style/AccessModifierDeclarations:
77
+ Exclude:
78
+ - 'lib/api_auth/headers.rb'
79
+
80
+ # Offense count: 9
81
+ Style/CommentedKeyword:
82
+ Exclude:
83
+ - 'lib/api_auth/base.rb'
84
+ - 'lib/api_auth/railtie.rb'
85
+
86
+ # Offense count: 4
87
+ Style/Documentation:
88
+ Exclude:
89
+ - 'spec/**/*'
90
+ - 'test/**/*'
91
+ - 'lib/api_auth/railtie.rb'
92
+ - 'lib/api_auth/request_drivers/rest_client.rb'
@@ -2,16 +2,18 @@ language: ruby
2
2
  sudo: false
3
3
  cache: bundler
4
4
  rvm:
5
- - 2.1.9
6
- - 2.2.6
7
- - 2.3.3
8
- - 2.4.1
5
+ - 2.4.3
6
+ - 2.5.3
7
+ - 2.6.1
8
+ - 2.7.1
9
9
  gemfile:
10
- - gemfiles/rails_4.gemfile
11
- - gemfiles/rails_41.gemfile
12
- - gemfiles/rails_42.gemfile
13
10
  - gemfiles/rails_5.gemfile
14
11
  - gemfiles/rails_51.gemfile
12
+ - gemfiles/rails_52.gemfile
13
+ - gemfiles/rails_60.gemfile
14
+ - gemfiles/http2.gemfile
15
+ - gemfiles/http3.gemfile
16
+ - gemfiles/http4.gemfile
15
17
  env:
16
18
  - TEST_SUITE=rake
17
19
 
@@ -22,15 +24,14 @@ script:
22
24
  - bundle exec $TEST_SUITE
23
25
 
24
26
  matrix:
25
- exclude:
26
- - rvm: 2.1.9
27
- gemfile: gemfiles/rails_5.gemfile
28
- - rvm: 2.1.9
29
- gemfile: gemfiles/rails_51.gemfile
30
27
  include:
31
- - rvm: 2.4.1
32
- gemfile: gemfiles/rails_5.gemfile
28
+ - rvm: 2.7.1
29
+ gemfile: gemfiles/rails_60.gemfile
33
30
  env: TEST_SUITE="rubocop lib/ spec/"
31
+ exclude:
32
+ - rvm: 2.4.3
33
+ gemfile: gemfiles/rails_60.gemfile
34
+ env: TEST_SUITE=rake
34
35
 
35
36
  notifications:
36
37
  email: false
@@ -1,3 +1,31 @@
1
+ # 2.4.1 (2020-06-23)
2
+ - Fix inadvertant ActiveSupport dependecy (#189 taylorthurlow)
3
+
4
+ # 2.4.0 (2020-05-05)
5
+ - Improved support for Rails 6.0 (#179 taylorthurlow, #177 fwininger)
6
+ - Added Ruby 2.6.0 support (#174 fwininger)
7
+ - README updates (#186 iranthau)
8
+
9
+ # 2.3.1 (2018-11-06)
10
+ - Fixed a regression in the http.rb driver (#173 tycooon)
11
+
12
+ # 2.3.0 (2018-10-23)
13
+ - Added support for Grape API (#169 phuongnd08 & dunghuynh)
14
+ - Added option for specifying customer headers to sign via new `headers_to_sign`
15
+ argument (#170 fakenine)
16
+ - Fix tests and drop support for Ruby < 2.3 (#171 fwininger)
17
+
18
+ # 2.2.0 (2018-03-12)
19
+ - Drop support ruby 1.x, rails 2.x, rails 3.x (#141 fwininger)
20
+ - Add http.rb request driver (#164 tycooon)
21
+ - Fix POST and PUT requests in RestClient (#151 fwininger)
22
+ - Allow clock skew to be user-defined (#136 mlarraz)
23
+ - Adds #original_uri method to all request drivers (#137 iMacTia)
24
+ - Rubocop and test fixes (fwininger & nicolasleger)
25
+ - Changed return type for request #content_md5 #timestamp #content_type (fwininger)
26
+ - Fix URI edge case where a URI contains another URI (zfletch)
27
+ - Updates to the README (zfletch)
28
+
1
29
  # 2.1.0 (2016-12-22)
2
30
  - Fixed a NoMethodError that might occur when using the NetHttp Driver (#130 grahamkenville)
3
31
  - More securely compare signatures in a way that prevents timing attacks (#56 leishman, #133 will0)
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
- gem 'rubocop', platforms: %i[ruby_20 ruby_21 ruby_22 ruby_23 ruby_24]
4
+ gem 'rubocop'
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # ApiAuth
2
2
 
3
- [![Build Status](https://travis-ci.org/mgomes/api_auth.png?branch=master)](https://travis-ci.org/mgomes/api_auth)
3
+ [![Build Status](https://travis-ci.org/mgomes/api_auth.svg?branch=master)](https://travis-ci.org/mgomes/api_auth)
4
+ [![Gem Version](https://badge.fury.io/rb/api-auth.svg)](https://badge.fury.io/rb/api-auth)
4
5
 
5
6
  Logins and passwords are for humans. Communication between applications need to
6
7
  be protected through different means.
@@ -20,19 +21,33 @@ have to be written in the same language as the clients.
20
21
  ## How it works
21
22
 
22
23
  1. A canonical string is first created using your HTTP headers containing the
23
- content-type, content-MD5, request URI and the timestamp. If content-type or
24
+ content-type, content-MD5, request path and the date/time stamp. If content-type or
24
25
  content-MD5 are not present, then a blank string is used in their place. If the
25
26
  timestamp isn't present, a valid HTTP date is automatically added to the
26
27
  request. The canonical string is computed as follows:
27
28
 
28
- canonical_string = 'http method,content-type,content-MD5,request URI,timestamp'
29
+ ```
30
+ canonical_string = "#{http method},#{content-type},#{content-MD5},#{request URI},#{timestamp}"
31
+
32
+ e.g.,
33
+
34
+ canonical_string = 'POST,application/json,,request_path,Tue, 30 May 2017 03:51:43 GMT'
35
+ ```
29
36
 
30
37
  2. This string is then used to create the signature which is a Base64 encoded
31
38
  SHA1 HMAC, using the client's private secret key.
32
39
 
33
40
  3. This signature is then added as the `Authorization` HTTP header in the form:
34
41
 
35
- Authorization = APIAuth 'client access id':'signature from step 2'
42
+ ```
43
+ Authorization = APIAuth "#{client access id}:#{signature from step 2}"
44
+ ```
45
+
46
+ A cURL request would look like:
47
+
48
+ ```
49
+ curl -X POST --header 'Content-Type: application/json' --header "Date: Tue, 30 May 2017 03:51:43 GMT" --header "Authorization: ${AUTHORIZATION}" http://my-app.com/request_path`
50
+ ```
36
51
 
37
52
  5. On the server side, the SHA1 HMAC is computed in the same way using the
38
53
  request headers and the client's secret key, which is known to only
@@ -51,9 +66,9 @@ minutes in order to avoid replay attacks.
51
66
 
52
67
  ## Requirement
53
68
 
54
- v3.X require Ruby 2.X and if you use Rails at least Rails 4.0.
69
+ This gem require Ruby >= 2.3 and Rails >= 4.0 if you use rails.
55
70
 
56
- For older version of Ruby or Rails, please use ApiAuth v2.X.
71
+ For older version of Ruby or Rails, please use ApiAuth v2.1 and older.
57
72
 
58
73
  **IMPORTANT: v2.0.0 is backwards incompatible with the default settings of v1.x to address a security vulnerability. See [CHANGELOG.md](/CHANGELOG.md) for security update information.**
59
74
 
@@ -62,7 +77,9 @@ For older version of Ruby or Rails, please use ApiAuth v2.X.
62
77
  The gem doesn't have any dependencies outside of having a working OpenSSL
63
78
  configuration for your Ruby VM. To install:
64
79
 
65
- [sudo] gem install api-auth
80
+ ```bash
81
+ [sudo] gem install api-auth
82
+ ```
66
83
 
67
84
  Please note the dash in the name versus the underscore.
68
85
 
@@ -78,8 +95,8 @@ Here is the current list of supported request objects:
78
95
  * Curb (Curl::Easy)
79
96
  * RestClient
80
97
  * Faraday
81
- * HTTParty
82
- * Httpi
98
+ * HTTPI
99
+ * HTTP
83
100
 
84
101
  ### HTTP Client Objects
85
102
 
@@ -88,25 +105,29 @@ Here's a sample implementation of signing a request created with RestClient.
88
105
  Assuming you have a client access id and secret as follows:
89
106
 
90
107
  ``` ruby
91
- @access_id = "1044"
92
- @secret_key = ApiAuth.generate_secret_key
108
+ @access_id = "1044"
109
+ @secret_key = ApiAuth.generate_secret_key
93
110
  ```
94
111
 
95
112
  A typical RestClient PUT request may look like:
96
113
 
97
114
  ``` ruby
98
- headers = { 'Content-MD5' => "e59ff97941044f85df5297e1c302d260",
99
- 'Content-Type' => "text/plain",
100
- 'Date' => "Mon, 23 Jan 1984 03:29:56 GMT" }
101
- @request = RestClient::Request.new(:url => "/resource.xml?foo=bar&bar=foo",
102
- :headers => headers,
103
- :method => :put)
115
+ headers = { 'Content-MD5' => "e59ff97941044f85df5297e1c302d260",
116
+ 'Content-Type' => "text/plain",
117
+ 'Date' => "Mon, 23 Jan 1984 03:29:56 GMT"
118
+ }
119
+
120
+ @request = RestClient::Request.new(
121
+ url: "/resource.xml?foo=bar&bar=foo",
122
+ headers: headers,
123
+ method: :put
124
+ )
104
125
  ```
105
126
 
106
127
  To sign that request, simply call the `sign!` method as follows:
107
128
 
108
129
  ``` ruby
109
- @signed_request = ApiAuth.sign!(@request, @access_id, @secret_key)
130
+ @signed_request = ApiAuth.sign!(@request, @access_id, @secret_key)
110
131
  ```
111
132
 
112
133
  The proper `Authorization` request header has now been added to that request
@@ -120,23 +141,27 @@ method detection (like Curb or httpi), you can pass the http method as an option
120
141
  into the sign! method like so:
121
142
 
122
143
  ``` ruby
123
- @signed_request = ApiAuth.sign!(@request, @access_id, @secret_key, :override_http_method => "PUT")
144
+ @signed_request = ApiAuth.sign!(@request, @access_id, @secret_key, :override_http_method => "PUT")
124
145
  ```
125
146
 
126
147
  If you want to use another digest existing in `OpenSSL::Digest`,
127
148
  you can pass the http method as an option into the sign! method like so:
128
149
 
129
150
  ``` ruby
130
- @signed_request = ApiAuth.sign!(@request, @access_id, @secret_key, :digest => 'sha256')
151
+ @signed_request = ApiAuth.sign!(@request, @access_id, @secret_key, :digest => 'sha256')
131
152
  ```
132
153
 
133
154
  With the `digest` option, the `Authorization` header will be change from:
134
155
 
135
- Authorization = APIAuth 'client access id':'signature'
156
+ ```
157
+ Authorization = APIAuth 'client access id':'signature'
158
+ ```
136
159
 
137
160
  to:
138
161
 
139
- Authorization = APIAuth-HMAC-DIGEST_NAME 'client access id':'signature'
162
+ ```
163
+ Authorization = APIAuth-HMAC-DIGEST_NAME 'client access id':'signature'
164
+ ```
140
165
 
141
166
  ### ActiveResource Clients
142
167
 
@@ -144,9 +169,9 @@ ApiAuth can transparently protect your ActiveResource communications with a
144
169
  single configuration line:
145
170
 
146
171
  ``` ruby
147
- class MyResource < ActiveResource::Base
148
- with_api_auth(access_id, secret_key)
149
- end
172
+ class MyResource < ActiveResource::Base
173
+ with_api_auth(access_id, secret_key)
174
+ end
150
175
  ```
151
176
 
152
177
  This will automatically sign all outgoing ActiveResource requests from your app.
@@ -168,26 +193,28 @@ clients as well as verifying incoming API requests.
168
193
  To generate a Base64 encoded API key for a client:
169
194
 
170
195
  ``` ruby
171
- ApiAuth.generate_secret_key
196
+ ApiAuth.generate_secret_key
172
197
  ```
173
198
 
174
199
  To validate whether or not a request is authentic:
175
200
 
176
201
  ``` ruby
177
- ApiAuth.authentic?(signed_request, secret_key)
202
+ ApiAuth.authentic?(signed_request, secret_key)
178
203
  ```
179
204
 
180
205
  The `authentic?` method uses the digest specified in the `Authorization` header.
181
206
  For example SHA256 for:
182
207
 
183
- Authorization = APIAuth-HMAC-SHA256 'client access id':'signature'
208
+ ```
209
+ Authorization = APIAuth-HMAC-SHA256 'client access id':'signature'
210
+ ```
184
211
 
185
212
  And by default SHA1 if the HMAC-DIGEST is not specified.
186
213
 
187
214
  If you want to force the usage of another digest method, you should pass it as an option parameter:
188
215
 
189
216
  ``` ruby
190
- ApiAuth.authentic?(signed_request, secret_key, :digest => 'sha256')
217
+ ApiAuth.authentic?(signed_request, secret_key, :digest => 'sha256')
191
218
  ```
192
219
 
193
220
  For security, requests dated older or newer than a certain timespan are considered inauthentic.
@@ -198,16 +225,24 @@ can't be dated into the far future.
198
225
  The default span is 15 minutes, but you can override this:
199
226
 
200
227
  ```ruby
201
- ApiAuth.authentic?(signed_request, secret_key, :clock_skew => 60) # or 1.minute in ActiveSupport
228
+ ApiAuth.authentic?(signed_request, secret_key, :clock_skew => 60) # or 1.minute in ActiveSupport
202
229
  ```
203
230
 
231
+ If you want to sign custom headers, you can pass them as an array of strings in the options like so:
232
+
233
+ ``` ruby
234
+ ApiAuth.authentic?(signed_request, secret_key, headers_to_sign: %w[HTTP_HEADER_NAME])
235
+ ```
236
+
237
+ With the specified headers values being at the end of the canonical string in the same order.
238
+
204
239
  If your server is a Rails app, the signed request will be the `request` object.
205
240
 
206
241
  In order to obtain the secret key for the client, you first need to look up the
207
242
  client's access_id. ApiAuth can pull that from the request headers for you:
208
243
 
209
244
  ``` ruby
210
- ApiAuth.access_id(signed_request)
245
+ ApiAuth.access_id(signed_request)
211
246
  ```
212
247
 
213
248
  Once you've looked up the client's record via the access id, you can then verify
@@ -219,12 +254,12 @@ Here's a sample method that can be used in a `before_action` if your server is a
219
254
  Rails app:
220
255
 
221
256
  ``` ruby
222
- before_action :api_authenticate
257
+ before_action :api_authenticate
223
258
 
224
- def api_authenticate
225
- @current_account = Account.find_by_access_id(ApiAuth.access_id(request))
226
- head(:unauthorized) unless @current_account && ApiAuth.authentic?(request, @current_account.secret_key)
227
- end
259
+ def api_authenticate
260
+ @current_account = Account.find_by_access_id(ApiAuth.access_id(request))
261
+ head(:unauthorized) unless @current_account && ApiAuth.authentic?(request, @current_account.secret_key)
262
+ end
228
263
  ```
229
264
 
230
265
  ## Development
@@ -237,11 +272,15 @@ To run the tests:
237
272
 
238
273
  Install the dependencies for a particular Rails version by specifying a gemfile in `gemfiles` directory:
239
274
 
240
- BUNDLE_GEMFILE=gemfiles/rails_5.gemfile bundle install
275
+ ```
276
+ BUNDLE_GEMFILE=gemfiles/rails_5.gemfile bundle install
277
+ ```
241
278
 
242
279
  Run the tests with those dependencies:
243
280
 
244
- BUNDLE_GEMFILE=gemfiles/rails_5.gemfile bundle exec rake
281
+ ```
282
+ BUNDLE_GEMFILE=gemfiles/rails_5.gemfile bundle exec rake
283
+ ```
245
284
 
246
285
  If you'd like to add support for additional HTTP clients, check out the already
247
286
  implemented drivers in `lib/api_auth/request_drivers` for reference. All of