rack-jwt 0.4.0 → 0.5.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/README.md +11 -3
- data/lib/rack/jwt/auth.rb +16 -6
- data/lib/rack/jwt/token.rb +9 -8
- data/lib/rack/jwt/version.rb +1 -1
- metadata +34 -22
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e07bb7937ca24d7787e58ae9733c38db07a4a86e3fffb660197bdf4bbda80e40
|
|
4
|
+
data.tar.gz: e52fcc5a9882d22a28dbed0d9e8e4cbaaf06db5015351afd558f3fc69d3ffae7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 70cd6e0e66b4ff1e4ac2f3662198a9bff90c8e8159f687646562b0efcc15810f44a40f28d254036e24cc851fde3846f0695e15ca9c78792907467e9c935fc482
|
|
7
|
+
data.tar.gz: 8b494ae14692de777fe2838e87869af27fe3ee29b6b1a1157a687779b6df3035a077637903fbafadf970f55635f91d98c079c04d10e0eacc520707d6a2d0b60c
|
data/README.md
CHANGED
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
|
|
9
9
|
This gem provides JSON Web Token (JWT) based authentication.
|
|
10
10
|
|
|
11
|
+
## Requirements
|
|
12
|
+
|
|
13
|
+
- Ruby 2.3.8 or greater
|
|
14
|
+
|
|
11
15
|
## Installation
|
|
12
16
|
|
|
13
17
|
Add this line to your application's `Gemfile`:
|
|
@@ -36,7 +40,7 @@ $ gem install rack-jwt
|
|
|
36
40
|
|
|
37
41
|
* `verify` : optional : Boolean : Determines whether JWT will verify tokens keys for mismatch key types when decoded. Default is `true`. Set to `false` if you are using the `'none'` algorithm.
|
|
38
42
|
|
|
39
|
-
* `options` : optional : Hash : A hash of options that are passed through to JWT to configure supported claims and algorithms. See
|
|
43
|
+
* `options` : optional : Hash : A hash of options that are passed through to JWT to configure supported claims and algorithms. See the ruby-jwt docs for [more information of the algorithms and their requirements](https://github.com/jwt/ruby-jwt#algorithms-and-usage) as well as [more information on the supported claims](https://github.com/progrium/ruby-jwt#support-for-reserved-claim-names). These options are passed through without change to the underlying `ruby-jwt` gem. By default only expiration (exp) and Not Before (nbf) claims are verified. Pass in an algorithm choice like `{ algorithm: 'HS256' }`.
|
|
40
44
|
|
|
41
45
|
* `exclude` : optional : Array : An Array of path strings representing paths that should not be checked for the presence of a valid JWT token. Excludes sub-paths as of specified paths as well (e.g. `%w(/docs)` excludes `/docs/some/thing.html` also). Each path should start with a `/`. If a path matches the current request path this entire middleware is skipped and no authentication or verification of tokens takes place.
|
|
42
46
|
|
|
@@ -61,7 +65,7 @@ Cuba.use Rack::JWT::Auth, my_args
|
|
|
61
65
|
### Rails
|
|
62
66
|
|
|
63
67
|
```ruby
|
|
64
|
-
Rails.application.config.middleware.use
|
|
68
|
+
Rails.application.config.middleware.use Rack::JWT::Auth, my_args
|
|
65
69
|
```
|
|
66
70
|
|
|
67
71
|
## Generating tokens
|
|
@@ -77,11 +81,15 @@ the [ruby-jwt gem repo](https://github.com/jwt/ruby-jwt/blob/master/README.md)
|
|
|
77
81
|
The `algorithm` is an optional String and can be one of the following (default HMAC 'HS256'):
|
|
78
82
|
|
|
79
83
|
```ruby
|
|
80
|
-
%w(none HS256 HS384 HS512 RS256 RS384 RS512 ES256 ES384 ES512)
|
|
84
|
+
%w(none HS256 HS384 HS512 RS256 RS384 RS512 ED25519 ES256 ES384 ES512)
|
|
81
85
|
|
|
82
86
|
HS256 is the default
|
|
83
87
|
```
|
|
84
88
|
|
|
89
|
+
Note that `ED25519` support depends on the `rbnacl` which is _not_ already included by the
|
|
90
|
+
`rack-jwt` gem. If you wish to use the `ED25519` algorith, you must also manually require
|
|
91
|
+
`rbnacl` gem in addition to `rack-jwt`.
|
|
92
|
+
|
|
85
93
|
Here is a sample payload with illustrative data. You don't have to use all,
|
|
86
94
|
or even most, of these.
|
|
87
95
|
|
data/lib/rack/jwt/auth.rb
CHANGED
|
@@ -9,7 +9,20 @@ module Rack
|
|
|
9
9
|
attr_reader :options
|
|
10
10
|
attr_reader :exclude
|
|
11
11
|
|
|
12
|
-
SUPPORTED_ALGORITHMS =
|
|
12
|
+
SUPPORTED_ALGORITHMS = [
|
|
13
|
+
'none',
|
|
14
|
+
'HS256',
|
|
15
|
+
'HS384',
|
|
16
|
+
'HS512',
|
|
17
|
+
'RS256',
|
|
18
|
+
'RS384',
|
|
19
|
+
'RS512',
|
|
20
|
+
'ES256',
|
|
21
|
+
'ES384',
|
|
22
|
+
'ES512',
|
|
23
|
+
('ED25519' if defined?(RbNaCl)),
|
|
24
|
+
].compact.freeze
|
|
25
|
+
|
|
13
26
|
DEFAULT_ALGORITHM = 'HS256'.freeze
|
|
14
27
|
|
|
15
28
|
# The last segment gets dropped for 'none' algorithm since there is no
|
|
@@ -94,10 +107,7 @@ module Rack
|
|
|
94
107
|
end
|
|
95
108
|
|
|
96
109
|
def check_secret_type!
|
|
97
|
-
unless @secret
|
|
98
|
-
@secret.is_a?(String) ||
|
|
99
|
-
@secret.is_a?(OpenSSL::PKey::RSA) ||
|
|
100
|
-
@secret.is_a?(OpenSSL::PKey::EC)
|
|
110
|
+
unless Token.secret_of_valid_type?(@secret)
|
|
101
111
|
raise ArgumentError, 'secret argument must be a valid type'
|
|
102
112
|
end
|
|
103
113
|
end
|
|
@@ -174,7 +184,7 @@ module Rack
|
|
|
174
184
|
|
|
175
185
|
def return_error(message)
|
|
176
186
|
body = { error: message }.to_json
|
|
177
|
-
headers = { 'Content-Type' => 'application/json'
|
|
187
|
+
headers = { 'Content-Type' => 'application/json' }
|
|
178
188
|
|
|
179
189
|
[401, headers, [body]]
|
|
180
190
|
end
|
data/lib/rack/jwt/token.rb
CHANGED
|
@@ -38,6 +38,15 @@ module Rack
|
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
+
def self.secret_of_valid_type?(secret)
|
|
42
|
+
secret.nil? ||
|
|
43
|
+
secret.is_a?(String) ||
|
|
44
|
+
secret.is_a?(OpenSSL::PKey::RSA) ||
|
|
45
|
+
secret.is_a?(OpenSSL::PKey::EC) ||
|
|
46
|
+
(defined?(RbNaCl) && secret.is_a?(RbNaCl::Signatures::Ed25519::SigningKey)) ||
|
|
47
|
+
(defined?(RbNaCl) && secret.is_a?(RbNaCl::Signatures::Ed25519::VerifyKey))
|
|
48
|
+
end
|
|
49
|
+
|
|
41
50
|
# Private Utility Class Methods
|
|
42
51
|
# See : https://gist.github.com/Integralist/bb8760d11a03c88da151
|
|
43
52
|
|
|
@@ -55,14 +64,6 @@ module Rack
|
|
|
55
64
|
verify.nil? || verify.is_a?(FalseClass) || verify.is_a?(TrueClass)
|
|
56
65
|
end
|
|
57
66
|
private_class_method :verify_of_valid_type?
|
|
58
|
-
|
|
59
|
-
def self.secret_of_valid_type?(secret)
|
|
60
|
-
secret.nil? ||
|
|
61
|
-
secret.is_a?(String) ||
|
|
62
|
-
secret.is_a?(OpenSSL::PKey::RSA) ||
|
|
63
|
-
secret.is_a?(OpenSSL::PKey::EC)
|
|
64
|
-
end
|
|
65
|
-
private_class_method :secret_of_valid_type?
|
|
66
67
|
end
|
|
67
68
|
end
|
|
68
69
|
end
|
data/lib/rack/jwt/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rack-jwt
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
|
-
- Mr. Eigenbart
|
|
8
7
|
- Emili Parreno
|
|
9
8
|
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain: []
|
|
12
|
-
date:
|
|
11
|
+
date: 2019-12-16 00:00:00.000000000 Z
|
|
13
12
|
dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
|
15
14
|
name: bundler
|
|
@@ -17,98 +16,112 @@ dependencies:
|
|
|
17
16
|
requirements:
|
|
18
17
|
- - "~>"
|
|
19
18
|
- !ruby/object:Gem::Version
|
|
20
|
-
version:
|
|
19
|
+
version: 1.16.2
|
|
21
20
|
type: :development
|
|
22
21
|
prerelease: false
|
|
23
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
24
23
|
requirements:
|
|
25
24
|
- - "~>"
|
|
26
25
|
- !ruby/object:Gem::Version
|
|
27
|
-
version:
|
|
26
|
+
version: 1.16.2
|
|
28
27
|
- !ruby/object:Gem::Dependency
|
|
29
28
|
name: rake
|
|
30
29
|
requirement: !ruby/object:Gem::Requirement
|
|
31
30
|
requirements:
|
|
32
31
|
- - "~>"
|
|
33
32
|
- !ruby/object:Gem::Version
|
|
34
|
-
version:
|
|
33
|
+
version: 12.0.0
|
|
35
34
|
type: :development
|
|
36
35
|
prerelease: false
|
|
37
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
38
37
|
requirements:
|
|
39
38
|
- - "~>"
|
|
40
39
|
- !ruby/object:Gem::Version
|
|
41
|
-
version:
|
|
40
|
+
version: 12.0.0
|
|
42
41
|
- !ruby/object:Gem::Dependency
|
|
43
42
|
name: rack-test
|
|
44
43
|
requirement: !ruby/object:Gem::Requirement
|
|
45
44
|
requirements:
|
|
46
45
|
- - "~>"
|
|
47
46
|
- !ruby/object:Gem::Version
|
|
48
|
-
version: 0.
|
|
47
|
+
version: 1.0.0
|
|
49
48
|
type: :development
|
|
50
49
|
prerelease: false
|
|
51
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
52
51
|
requirements:
|
|
53
52
|
- - "~>"
|
|
54
53
|
- !ruby/object:Gem::Version
|
|
55
|
-
version: 0.
|
|
54
|
+
version: 1.0.0
|
|
56
55
|
- !ruby/object:Gem::Dependency
|
|
57
56
|
name: rspec
|
|
58
57
|
requirement: !ruby/object:Gem::Requirement
|
|
59
58
|
requirements:
|
|
60
59
|
- - "~>"
|
|
61
60
|
- !ruby/object:Gem::Version
|
|
62
|
-
version: 3.
|
|
61
|
+
version: 3.8.0
|
|
63
62
|
type: :development
|
|
64
63
|
prerelease: false
|
|
65
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
66
65
|
requirements:
|
|
67
66
|
- - "~>"
|
|
68
67
|
- !ruby/object:Gem::Version
|
|
69
|
-
version: 3.
|
|
68
|
+
version: 3.8.0
|
|
70
69
|
- !ruby/object:Gem::Dependency
|
|
71
70
|
name: simplecov
|
|
72
71
|
requirement: !ruby/object:Gem::Requirement
|
|
73
72
|
requirements:
|
|
74
73
|
- - "~>"
|
|
75
74
|
- !ruby/object:Gem::Version
|
|
76
|
-
version: 0.
|
|
75
|
+
version: 0.16.0
|
|
77
76
|
type: :development
|
|
78
77
|
prerelease: false
|
|
79
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
80
79
|
requirements:
|
|
81
80
|
- - "~>"
|
|
82
81
|
- !ruby/object:Gem::Version
|
|
83
|
-
version: 0.
|
|
82
|
+
version: 0.16.0
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: rbnacl
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: 6.0.1
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: 6.0.1
|
|
84
97
|
- !ruby/object:Gem::Dependency
|
|
85
98
|
name: rack
|
|
86
99
|
requirement: !ruby/object:Gem::Requirement
|
|
87
100
|
requirements:
|
|
88
|
-
- - "
|
|
101
|
+
- - "~>"
|
|
89
102
|
- !ruby/object:Gem::Version
|
|
90
|
-
version:
|
|
103
|
+
version: 2.0.0
|
|
91
104
|
type: :runtime
|
|
92
105
|
prerelease: false
|
|
93
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
94
107
|
requirements:
|
|
95
|
-
- - "
|
|
108
|
+
- - "~>"
|
|
96
109
|
- !ruby/object:Gem::Version
|
|
97
|
-
version:
|
|
110
|
+
version: 2.0.0
|
|
98
111
|
- !ruby/object:Gem::Dependency
|
|
99
112
|
name: jwt
|
|
100
113
|
requirement: !ruby/object:Gem::Requirement
|
|
101
114
|
requirements:
|
|
102
115
|
- - "~>"
|
|
103
116
|
- !ruby/object:Gem::Version
|
|
104
|
-
version:
|
|
117
|
+
version: 2.1.0
|
|
105
118
|
type: :runtime
|
|
106
119
|
prerelease: false
|
|
107
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
108
121
|
requirements:
|
|
109
122
|
- - "~>"
|
|
110
123
|
- !ruby/object:Gem::Version
|
|
111
|
-
version:
|
|
124
|
+
version: 2.1.0
|
|
112
125
|
description: Rack middleware that provides authentication based on JSON Web Tokens.
|
|
113
126
|
email:
|
|
114
127
|
- emili@eparreno.com
|
|
@@ -134,15 +147,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
134
147
|
requirements:
|
|
135
148
|
- - ">="
|
|
136
149
|
- !ruby/object:Gem::Version
|
|
137
|
-
version: 2.
|
|
150
|
+
version: 2.3.8
|
|
138
151
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
152
|
requirements:
|
|
140
153
|
- - ">="
|
|
141
154
|
- !ruby/object:Gem::Version
|
|
142
155
|
version: '0'
|
|
143
156
|
requirements: []
|
|
144
|
-
|
|
145
|
-
rubygems_version: 2.7.6
|
|
157
|
+
rubygems_version: 3.0.3
|
|
146
158
|
signing_key:
|
|
147
159
|
specification_version: 4
|
|
148
160
|
summary: Rack middleware that provides authentication based on JSON Web Tokens.
|