jwt_signed_request 2.1.3 → 2.2.0

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
- SHA1:
3
- metadata.gz: a0e53cf237dc90239e067304c6d19b915876406a
4
- data.tar.gz: 8947ddeb892b55b07d62f30a74c2c3c9da113f03
2
+ SHA256:
3
+ metadata.gz: e3c77d8fa516ef20dd47873584e1533ce01ccda49d0486825177f53e74d165b0
4
+ data.tar.gz: f54b28aaebb16861a13d129541a2e75a5260d6f19c58c757670952bb3568f8f8
5
5
  SHA512:
6
- metadata.gz: 1eae234dd7fe4926294543dfb8275cc108addd326056549c5d6197acf802fcdda1976ce91e69d6dee55cf4efc6ca96852f2d1a61f5ce2e3da795d3f7282f3127
7
- data.tar.gz: 2729d396489255fedd6e75369a95deec8e064c390d346b3355d783dd37da2ae80adc847762d744297eac4cd228993a95229cd0cc51f71d975011f49eab6b6179
6
+ metadata.gz: f862b757d5387bcf0ec6f71af7d80b77a8e9d5d906e6957abea7f891c2e452c4a27cac096170f44c24798291feb62d03166f943487044999948d815358f3d1fc
7
+ data.tar.gz: e67c0b8346883be09a595f2038de8c0e10400230c2cb90d209c66f1a15a9b6c53282cbf28c19c00e84599bbde8787396d319594c163f9acd93f16df833a3f4fd
data/README.md CHANGED
@@ -190,7 +190,7 @@ Many thanks to the following contributors to this gem:
190
190
  - Odin Dutton - [@twe4ked](https://github.com/twe4ked)
191
191
  - Sebastian von Conrad - [@vonconrad](https://github.com/vonconrad)
192
192
  - Zubin Henner- [@zubin](https://github.com/zubin)
193
- - Glen Tweedie - [@nocache](https://github.com/nocache)
193
+ - Glenn Tweedie - [@nocache](https://github.com/nocache)
194
194
  - Giancarlo Salamanca - [@salamagd](https://github.com/salamagd)
195
195
  - Ben Axnick - [@bentheax](https://github.com/bentheax)
196
196
  - Glen Stampoultzis - [@gstamp](https://github.com/gstamp)
@@ -0,0 +1,16 @@
1
+ module JWTSignedRequest
2
+ UnauthorizedRequestError = Class.new(StandardError)
3
+ MissingAuthorizationHeaderError = Class.new(UnauthorizedRequestError)
4
+ JWTDecodeError = Class.new(UnauthorizedRequestError)
5
+
6
+ RequestVerificationFailedError = Class.new(UnauthorizedRequestError)
7
+ RequestBodyVerificationFailedError = Class.new(RequestVerificationFailedError)
8
+ RequestHeaderVerificationFailedError = Class.new(RequestVerificationFailedError)
9
+ RequestMethodVerificationFailedError = Class.new(RequestVerificationFailedError)
10
+ RequestPathVerificationFailedError = Class.new(RequestVerificationFailedError)
11
+ RequestQueryVerificationFailedError = Class.new(RequestVerificationFailedError)
12
+
13
+ MissingKeyIdError = Class.new(UnauthorizedRequestError)
14
+ UnknownKeyIdError = Class.new(UnauthorizedRequestError)
15
+ AlgorithmMismatchError = Class.new(UnauthorizedRequestError)
16
+ end
@@ -1,4 +1,5 @@
1
1
  require 'jwt_signed_request/headers'
2
+ require 'jwt_signed_request/errors'
2
3
 
3
4
  module JWTSignedRequest
4
5
  class Verify
@@ -20,9 +21,7 @@ module JWTSignedRequest
20
21
  raise MissingAuthorizationHeaderError, "Missing Authorization header in the request"
21
22
  end
22
23
 
23
- unless verified_request?
24
- raise RequestVerificationFailedError, "Request failed verification"
25
- end
24
+ verify_request!
26
25
  end
27
26
 
28
27
  private
@@ -68,11 +67,28 @@ module JWTSignedRequest
68
67
  end
69
68
  end
70
69
 
71
- def verified_request?
72
- claims['method'].to_s.downcase == request.request_method.downcase &&
73
- claims['path'] == request.fullpath &&
74
- claims['body_sha'] == Digest::SHA256.hexdigest(request_body) &&
75
- verified_headers?
70
+ def verify_request!
71
+ unless request.request_method.casecmp(claims['method'].to_s) == 0
72
+ raise RequestMethodVerificationFailedError,
73
+ "Request failed method verification.\nexpected:#{claims['method']}\nreceived:#{request.request_method}"
74
+ end
75
+ unless parsed_claims_uri.path == request.path
76
+ raise RequestPathVerificationFailedError,
77
+ "Request failed path verification.\nexpected:#{parsed_claims_uri.path}\nreceived:#{request.path}"
78
+ end
79
+ unless claims_query_values == request_query_values
80
+ raise RequestQueryVerificationFailedError,
81
+ "Request failed query string verification.\nexpected:#{claims_query_values}\nreceived:#{request_query_values}"
82
+ end
83
+ unless claims['body_sha'] == Digest::SHA256.hexdigest(request_body)
84
+ raise RequestBodyVerificationFailedError,
85
+ "Request failed body verification.\nexpected:#{claims['body_sha']}\
86
+ received:#{Digest::SHA256.hexdigest(request_body)}"
87
+ end
88
+ unless verified_headers?
89
+ raise RequestHeaderVerificationFailedError,
90
+ "Request failed header verification.\nexpected:#{claims['headers']}"
91
+ end
76
92
  end
77
93
 
78
94
  def request_body
@@ -92,5 +108,21 @@ module JWTSignedRequest
92
108
  Headers.fetch(header_key, request) == header_value
93
109
  end
94
110
  end
111
+
112
+ def parsed_claims_uri
113
+ @parsed_claims_uri ||= URI.parse(claims['path'])
114
+ end
115
+
116
+ def standard_query_values(path)
117
+ URI.decode_www_form(path.query).sort if path && path.query
118
+ end
119
+
120
+ def claims_query_values
121
+ standard_query_values(parsed_claims_uri)
122
+ end
123
+
124
+ def request_query_values
125
+ standard_query_values(URI.parse(request.fullpath))
126
+ end
95
127
  end
96
128
  end
@@ -1,3 +1,3 @@
1
1
  module JWTSignedRequest
2
- VERSION = "2.1.3".freeze
2
+ VERSION = "2.2.0".freeze
3
3
  end
@@ -2,6 +2,7 @@ require 'jwt'
2
2
  require 'jwt_signed_request/key_store'
3
3
  require 'jwt_signed_request/sign'
4
4
  require 'jwt_signed_request/verify'
5
+ require 'jwt_signed_request/errors'
5
6
 
6
7
  module JWTSignedRequest
7
8
  extend self
@@ -9,14 +10,6 @@ module JWTSignedRequest
9
10
  DEFAULT_ALGORITHM = 'ES256'.freeze
10
11
  EMPTY_BODY = "".freeze
11
12
 
12
- UnauthorizedRequestError = Class.new(StandardError)
13
- MissingAuthorizationHeaderError = Class.new(UnauthorizedRequestError)
14
- JWTDecodeError = Class.new(UnauthorizedRequestError)
15
- RequestVerificationFailedError = Class.new(UnauthorizedRequestError)
16
- MissingKeyIdError = Class.new(UnauthorizedRequestError)
17
- UnknownKeyIdError = Class.new(UnauthorizedRequestError)
18
- AlgorithmMismatchError = Class.new(UnauthorizedRequestError)
19
-
20
13
  def configure_keys
21
14
  yield(key_store)
22
15
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jwt_signed_request
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.3
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Envato
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-18 00:00:00.000000000 Z
11
+ date: 2018-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jwt
@@ -118,6 +118,7 @@ files:
118
118
  - README.md
119
119
  - lib/jwt_signed_request.rb
120
120
  - lib/jwt_signed_request/claims.rb
121
+ - lib/jwt_signed_request/errors.rb
121
122
  - lib/jwt_signed_request/headers.rb
122
123
  - lib/jwt_signed_request/key_store.rb
123
124
  - lib/jwt_signed_request/middlewares/faraday.rb
@@ -144,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
145
  version: '0'
145
146
  requirements: []
146
147
  rubyforge_project:
147
- rubygems_version: 2.6.13
148
+ rubygems_version: 2.7.6
148
149
  signing_key:
149
150
  specification_version: 4
150
151
  summary: JWT request signing and verification for Internal APIs