jwt-authorizer 1.0.0 → 2.0.0
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 +4 -4
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +12 -10
- data/README.md +6 -2
- data/lib/jwt/authorizer/version.rb +1 -1
- data/lib/jwt/authorizer.rb +3 -0
- data/lib/jwt/token/asymmetric_key_configuration.rb +47 -0
- data/lib/jwt/token/builder.rb +1 -1
- data/lib/jwt/token/configurable.rb +1 -1
- data/lib/jwt/token/configuration.rb +20 -17
- data/lib/jwt/token/hmac_configuration.rb +17 -0
- data/lib/jwt/token/verifier.rb +6 -7
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c254092f30d5fb5f9d152e33ae49e915eb102cb831258ba231312e9204d36f24
|
4
|
+
data.tar.gz: 4ac378bd9ece18fc5cfd4243415b0e820d2c82a48180da5b012120499c60346d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '05694a5caddeef86498257f5768d4f57be2ccc6a41e638c93a5ec8ec7bc202a2d5ba7fa940e326ccaf360f9758f28bfa037d5ed402c820e6ec24c872cca71197'
|
7
|
+
data.tar.gz: f7689a3b2c287c79e2294eacbbd39a6dcb245272853065b0f3c3264b2d6105dc60cc4849005b7be488cce95cd5658683835d4126f8434131eee12f31a91d692b
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
jwt-authorizer (
|
4
|
+
jwt-authorizer (2.0.0)
|
5
5
|
jwt (~> 2.1)
|
6
6
|
|
7
7
|
GEM
|
@@ -10,20 +10,21 @@ GEM
|
|
10
10
|
ast (2.4.0)
|
11
11
|
coderay (1.1.2)
|
12
12
|
diff-lcs (1.3)
|
13
|
-
docile (1.1
|
13
|
+
docile (1.3.1)
|
14
|
+
jaro_winkler (1.5.1)
|
14
15
|
json (2.1.0)
|
15
16
|
jwt (2.1.0)
|
16
17
|
method_source (0.9.0)
|
17
18
|
parallel (1.12.1)
|
18
|
-
parser (2.5.0
|
19
|
+
parser (2.5.1.0)
|
19
20
|
ast (~> 2.4.0)
|
20
|
-
powerpack (0.1.
|
21
|
+
powerpack (0.1.2)
|
21
22
|
pry (0.11.3)
|
22
23
|
coderay (~> 1.1.0)
|
23
24
|
method_source (~> 0.9.0)
|
24
|
-
rack (2.0.
|
25
|
+
rack (2.0.5)
|
25
26
|
rainbow (3.0.0)
|
26
|
-
rake (12.3.
|
27
|
+
rake (12.3.1)
|
27
28
|
rspec (3.7.0)
|
28
29
|
rspec-core (~> 3.7.0)
|
29
30
|
rspec-expectations (~> 3.7.0)
|
@@ -37,7 +38,8 @@ GEM
|
|
37
38
|
diff-lcs (>= 1.2.0, < 2.0)
|
38
39
|
rspec-support (~> 3.7.0)
|
39
40
|
rspec-support (3.7.1)
|
40
|
-
rubocop (0.
|
41
|
+
rubocop (0.57.2)
|
42
|
+
jaro_winkler (~> 1.5.1)
|
41
43
|
parallel (~> 1.10)
|
42
44
|
parser (>= 2.5)
|
43
45
|
powerpack (~> 0.1)
|
@@ -45,13 +47,13 @@ GEM
|
|
45
47
|
ruby-progressbar (~> 1.7)
|
46
48
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
47
49
|
ruby-progressbar (1.9.0)
|
48
|
-
simplecov (0.
|
49
|
-
docile (~> 1.1
|
50
|
+
simplecov (0.16.1)
|
51
|
+
docile (~> 1.1)
|
50
52
|
json (>= 1.8, < 3)
|
51
53
|
simplecov-html (~> 0.10.0)
|
52
54
|
simplecov-html (0.10.2)
|
53
55
|
timecop (0.9.1)
|
54
|
-
unicode-display_width (1.
|
56
|
+
unicode-display_width (1.4.0)
|
55
57
|
|
56
58
|
PLATFORMS
|
57
59
|
ruby
|
data/README.md
CHANGED
@@ -32,14 +32,18 @@ JWT::Token.configuration
|
|
32
32
|
JWT::Token.configure do |config|
|
33
33
|
config.expiry = 12 * 60 * 60
|
34
34
|
config.algorithm = "RS256"
|
35
|
-
config.
|
35
|
+
config.rsa.authorized_keys = [OpenSSL::PKey::RSA.new(ENV["SECRET_KEY"])]
|
36
36
|
end
|
37
37
|
```
|
38
38
|
|
39
39
|
`JWT::Token` have following options available:
|
40
40
|
|
41
41
|
* `algorithm` - determines algorithm used on signing and verifying JWT tokens. Defaults to `"HS256"`.
|
42
|
-
* `
|
42
|
+
* `hmac` - [`HMAC`](https://en.wikipedia.org/wiki/HMAC) configuration:
|
43
|
+
- `hmac.key` - symmetric key used by HMAC algorithm
|
44
|
+
* `rsa` | `ecdsa` - [`RSA`](https://en.wikipedia.org/wiki/RSA_(cryptosystem)) and [`ECDSA`](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) configuration:
|
45
|
+
- `rsa.authorized_keys` | `ecdsa.authorized_keys` - `Array` of `OpenSSL::PKey::PKey` objects with allowed public keys
|
46
|
+
- `rsa.authorized_keys_file` | `ecdsa.authorized_keys_file` - path to file containing authorized public keys in PEM format
|
43
47
|
* `expiry` - sets default expiry for generated tokens. Defaults to 1 hour. It can be set to `nil` in order to not include `exp` claim in the token
|
44
48
|
* `issuer` - sets `iss` claim in the token. Defaults to `nil`.
|
45
49
|
* `allowed_issuers` - array of issuers that will be allowed on token verification. Defaults to empty array, tokens with any value in `iss` claim (and without this claim) will be valid. If array contains any elements, *only* listed issuers will be valid.
|
data/lib/jwt/authorizer.rb
CHANGED
@@ -3,7 +3,10 @@
|
|
3
3
|
require "jwt/authorizer/version"
|
4
4
|
require "jwt"
|
5
5
|
|
6
|
+
require "jwt/token/asymmetric_key_configuration"
|
6
7
|
require "jwt/token/builder"
|
8
|
+
require "jwt/token/hmac_configuration"
|
9
|
+
require "jwt/token/configuration"
|
7
10
|
require "jwt/token/configuration"
|
8
11
|
require "jwt/token/configurable"
|
9
12
|
require "jwt/token/verifier"
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JWT
|
4
|
+
class Token
|
5
|
+
class AsymmetricKeyConfiguration
|
6
|
+
class PublicKeySet
|
7
|
+
def initialize(keys)
|
8
|
+
@keys = keys
|
9
|
+
end
|
10
|
+
|
11
|
+
def verify(digest, signature, data)
|
12
|
+
@keys.any? { |key| key.verify(digest, signature, data) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_accessor :authorized_keys, :private_key
|
17
|
+
|
18
|
+
def initialize(key_class)
|
19
|
+
@key_class = key_class
|
20
|
+
end
|
21
|
+
|
22
|
+
def authorized_keys_file=(file_path)
|
23
|
+
self.authorized_keys =
|
24
|
+
File.read(file_path)
|
25
|
+
.each_line("-----END PUBLIC KEY-----\n")
|
26
|
+
.map { |pem| @key_class.new(pem) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def public_key
|
30
|
+
PublicKeySet.new(authorized_keys) if authorized_keys
|
31
|
+
end
|
32
|
+
|
33
|
+
def freeze
|
34
|
+
super
|
35
|
+
authorized_keys&.freeze
|
36
|
+
authorized_keys&.map(&:freeze)
|
37
|
+
end
|
38
|
+
|
39
|
+
def dup
|
40
|
+
super.tap do |new_config|
|
41
|
+
new_config.instance_variable_set("@private_key", private_key.dup)
|
42
|
+
new_config.instance_variable_set("@authorized_keys", authorized_keys&.map(&:dup))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/jwt/token/builder.rb
CHANGED
@@ -6,7 +6,7 @@ module JWT
|
|
6
6
|
def self.included(base)
|
7
7
|
base.extend(ClassMethods)
|
8
8
|
base.extend(Forwardable)
|
9
|
-
base.delegate %i[algorithm
|
9
|
+
base.delegate %i[algorithm private_key allowed_issuers] => "self.class.configuration"
|
10
10
|
end
|
11
11
|
|
12
12
|
module ClassMethods
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module JWT
|
4
4
|
class Token
|
5
5
|
class Configuration
|
6
|
-
ATTRIBUTES = %i[algorithm
|
6
|
+
ATTRIBUTES = %i[algorithm hmac rsa ecdsa expiry issuer allowed_issuers allowed_algorithms].freeze
|
7
7
|
|
8
8
|
ALGORITHMS = {
|
9
9
|
"HS256" => :hmac, "HS512256" => :hmac, "HS384" => :hmac, "HS512" => :hmac,
|
@@ -15,29 +15,28 @@ module JWT
|
|
15
15
|
@algorithm = "HS256"
|
16
16
|
@expiry = 60 * 60
|
17
17
|
@allowed_issuers = []
|
18
|
+
@allowed_algorithms = ["HS256"]
|
19
|
+
@hmac = HMACConfiguration.new
|
20
|
+
@rsa = AsymmetricKeyConfiguration.new(OpenSSL::PKey::RSA)
|
21
|
+
@ecdsa = AsymmetricKeyConfiguration.new(OpenSSL::PKey::EC)
|
18
22
|
end
|
19
23
|
|
20
|
-
attr_accessor :expiry, :allowed_issuers, :issuer
|
21
|
-
attr_reader :
|
24
|
+
attr_accessor :expiry, :allowed_issuers, :allowed_algorithms, :issuer
|
25
|
+
attr_reader :algorithm, :hmac, :rsa, :ecdsa
|
22
26
|
|
23
27
|
def algorithm=(value)
|
24
28
|
assert_algorithm_valid(value)
|
25
29
|
@algorithm = value.to_s
|
26
30
|
end
|
27
31
|
|
28
|
-
def secret=(hmac_key = nil, private_key: nil, public_key: nil)
|
29
|
-
@secret = case algorithm_type
|
30
|
-
when :hmac
|
31
|
-
{ private: hmac_key, public: hmac_key }
|
32
|
-
else
|
33
|
-
{ private: private_key, public: public_key }
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
32
|
def algorithm_type
|
38
33
|
ALGORITHMS[algorithm]
|
39
34
|
end
|
40
35
|
|
36
|
+
def private_key
|
37
|
+
send(algorithm_type).private_key
|
38
|
+
end
|
39
|
+
|
41
40
|
def to_h
|
42
41
|
ATTRIBUTES.each_with_object({}) { |attribute, hash| hash[attribute] = send(attribute) }
|
43
42
|
end
|
@@ -47,7 +46,11 @@ module JWT
|
|
47
46
|
raise ArgumentError, "Unpermitted options: #{unpermitted_options.join(', ')}" if unpermitted_options.any?
|
48
47
|
|
49
48
|
options.each do |key, value|
|
50
|
-
|
49
|
+
if value.is_a?(Hash)
|
50
|
+
send(key).tap { |option| value.each { |suboption, subvalue| option.send("#{suboption}=", subvalue) } }
|
51
|
+
else
|
52
|
+
send("#{key}=", value)
|
53
|
+
end
|
51
54
|
end
|
52
55
|
|
53
56
|
self
|
@@ -55,15 +58,15 @@ module JWT
|
|
55
58
|
|
56
59
|
def dup
|
57
60
|
super.tap do |new_config|
|
58
|
-
|
59
|
-
|
61
|
+
%i[allowed_issuers allowed_algorithms hmac rsa ecdsa].each do |option|
|
62
|
+
new_config.instance_variable_set("@#{option}", send(option).dup)
|
63
|
+
end
|
60
64
|
end
|
61
65
|
end
|
62
66
|
|
63
67
|
def freeze
|
64
68
|
super
|
65
|
-
allowed_issuers.freeze
|
66
|
-
secret.freeze
|
69
|
+
[allowed_issuers, allowed_algorithms, hmac, rsa, ecdsa].each(&:freeze)
|
67
70
|
end
|
68
71
|
|
69
72
|
private
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JWT
|
4
|
+
class Token
|
5
|
+
class HMACConfiguration
|
6
|
+
attr_accessor :key
|
7
|
+
alias public_key key
|
8
|
+
alias private_key key
|
9
|
+
|
10
|
+
def dup
|
11
|
+
super.tap do |new_config|
|
12
|
+
new_config.instance_variable_set("@key", key.dup)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/jwt/token/verifier.rb
CHANGED
@@ -10,7 +10,10 @@ module JWT
|
|
10
10
|
|
11
11
|
module ClassMethods
|
12
12
|
def verify(jwt_token, context = nil)
|
13
|
-
decoded = JWT.decode(jwt_token,
|
13
|
+
decoded = JWT.decode(jwt_token, nil, true, decode_options) do |header|
|
14
|
+
algorithm_type = JWT::Token::Configuration::ALGORITHMS[header["alg"]]
|
15
|
+
configuration.send(algorithm_type).public_key if algorithm_type
|
16
|
+
end
|
14
17
|
|
15
18
|
new(decoded[0]).tap do |token|
|
16
19
|
claims.each do |claim|
|
@@ -22,12 +25,8 @@ module JWT
|
|
22
25
|
private
|
23
26
|
|
24
27
|
def decode_options
|
25
|
-
{}.tap do |result|
|
26
|
-
if configuration.allowed_issuers.any?
|
27
|
-
result[:iss] = configuration.allowed_issuers
|
28
|
-
result[:verify_iss] = true
|
29
|
-
end
|
30
|
-
result[:algorithm] = configuration.algorithm
|
28
|
+
{ algorithms: configuration.allowed_algorithms }.tap do |result|
|
29
|
+
result.merge!(iss: configuration.allowed_issuers, verify_iss: true) if configuration.allowed_issuers.any?
|
31
30
|
end
|
32
31
|
end
|
33
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jwt-authorizer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michał Begejowicz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jwt
|
@@ -162,12 +162,14 @@ files:
|
|
162
162
|
- lib/jwt/authorizer/version.rb
|
163
163
|
- lib/jwt/endpoint_token.rb
|
164
164
|
- lib/jwt/token.rb
|
165
|
+
- lib/jwt/token/asymmetric_key_configuration.rb
|
165
166
|
- lib/jwt/token/builder.rb
|
166
167
|
- lib/jwt/token/claim.rb
|
167
168
|
- lib/jwt/token/claim_builder.rb
|
168
169
|
- lib/jwt/token/configurable.rb
|
169
170
|
- lib/jwt/token/configuration.rb
|
170
171
|
- lib/jwt/token/default_claims.rb
|
172
|
+
- lib/jwt/token/hmac_configuration.rb
|
171
173
|
- lib/jwt/token/verifier.rb
|
172
174
|
homepage: https://github.com/codesthq/jwt-authorizer
|
173
175
|
licenses:
|
@@ -189,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
189
191
|
version: '0'
|
190
192
|
requirements: []
|
191
193
|
rubyforge_project:
|
192
|
-
rubygems_version: 2.7.
|
194
|
+
rubygems_version: 2.7.6
|
193
195
|
signing_key:
|
194
196
|
specification_version: 4
|
195
197
|
summary: Authorization of requests for microservices based on JWT
|