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 +5 -5
- data/README.md +1 -1
- data/lib/jwt_signed_request/errors.rb +16 -0
- data/lib/jwt_signed_request/verify.rb +40 -8
- data/lib/jwt_signed_request/version.rb +1 -1
- data/lib/jwt_signed_request.rb +1 -8
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e3c77d8fa516ef20dd47873584e1533ce01ccda49d0486825177f53e74d165b0
|
4
|
+
data.tar.gz: f54b28aaebb16861a13d129541a2e75a5260d6f19c58c757670952bb3568f8f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
-
|
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
|
-
|
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
|
72
|
-
claims['method'].to_s
|
73
|
-
|
74
|
-
|
75
|
-
|
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
|
data/lib/jwt_signed_request.rb
CHANGED
@@ -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.
|
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:
|
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
|
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
|