jwt 1.5.6 → 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/.ebert.yml +17 -0
- data/.reek.yml +40 -0
- data/.rubocop.yml +96 -0
- data/.travis.yml +9 -8
- data/CHANGELOG.md +82 -1
- data/Gemfile +0 -1
- data/README.md +71 -8
- data/lib/jwt/decode.rb +21 -29
- data/lib/jwt/default_options.rb +14 -0
- data/lib/jwt/encode.rb +51 -0
- data/lib/jwt/error.rb +2 -0
- data/lib/jwt/security_utils.rb +52 -0
- data/lib/jwt/signature.rb +106 -0
- data/lib/jwt/verify.rb +48 -53
- data/lib/jwt/version.rb +3 -3
- data/lib/jwt.rb +28 -159
- data/ruby-jwt.gemspec +4 -3
- data/spec/integration/readme_examples_spec.rb +20 -8
- data/spec/jwt/verify_spec.rb +64 -42
- data/spec/jwt_spec.rb +49 -32
- data/spec/spec_helper.rb +4 -7
- metadata +33 -15
- data/lib/jwt/json.rb +0 -17
data/spec/jwt/verify_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'spec_helper'
|
3
4
|
require 'jwt/verify'
|
4
5
|
|
@@ -8,8 +9,8 @@ module JWT
|
|
8
9
|
let(:options) { { leeway: 0 } }
|
9
10
|
|
10
11
|
context '.verify_aud(payload, options)' do
|
11
|
-
let(:scalar_aud) { 'ruby-jwt-
|
12
|
-
let(:array_aud) { %w
|
12
|
+
let(:scalar_aud) { 'ruby-jwt-aud' }
|
13
|
+
let(:array_aud) { %w[ruby-jwt-aud test-aud ruby-ruby-ruby] }
|
13
14
|
let(:scalar_payload) { base_payload.merge('aud' => scalar_aud) }
|
14
15
|
let(:array_payload) { base_payload.merge('aud' => array_aud) }
|
15
16
|
|
@@ -25,44 +26,24 @@ module JWT
|
|
25
26
|
end.to raise_error JWT::InvalidAudError
|
26
27
|
end
|
27
28
|
|
28
|
-
it 'must raise JWT::InvalidAudError when the singular audience does not match and the options aud key is a string' do
|
29
|
-
expect do
|
30
|
-
Verify.verify_aud(scalar_payload, options.merge('aud' => 'no-match'))
|
31
|
-
end.to raise_error JWT::InvalidAudError
|
32
|
-
end
|
33
|
-
|
34
29
|
it 'must allow a matching singular audience to pass' do
|
35
30
|
Verify.verify_aud(scalar_payload, options.merge(aud: scalar_aud))
|
36
31
|
end
|
37
32
|
|
38
|
-
it 'must allow a matching audence to pass when the options key is a string' do
|
39
|
-
Verify.verify_aud(scalar_payload, options.merge('aud' => scalar_aud))
|
40
|
-
end
|
41
|
-
|
42
33
|
it 'must allow an array with any value matching the one in the options' do
|
43
34
|
Verify.verify_aud(array_payload, options.merge(aud: array_aud.first))
|
44
35
|
end
|
45
36
|
|
46
|
-
it 'must allow an array with any value matching
|
47
|
-
Verify.verify_aud(array_payload, options.merge(
|
37
|
+
it 'must allow an array with any value matching any value in the options array' do
|
38
|
+
Verify.verify_aud(array_payload, options.merge(aud: array_aud))
|
48
39
|
end
|
49
40
|
|
50
|
-
it '
|
51
|
-
options
|
52
|
-
'ruby-jwt-aud',
|
53
|
-
'test-aud',
|
54
|
-
'ruby-ruby-ruby',
|
55
|
-
:test
|
56
|
-
]
|
57
|
-
|
58
|
-
array_payload['aud'].push('test')
|
59
|
-
|
60
|
-
Verify.verify_aud(array_payload, options)
|
41
|
+
it 'must allow a singular audience payload matching any value in the options array' do
|
42
|
+
Verify.verify_aud(scalar_payload, options.merge(aud: array_aud))
|
61
43
|
end
|
62
44
|
end
|
63
45
|
|
64
46
|
context '.verify_expiration(payload, options)' do
|
65
|
-
let(:leeway) { 10 }
|
66
47
|
let(:payload) { base_payload.merge('exp' => (Time.now.to_i - 5)) }
|
67
48
|
|
68
49
|
it 'must raise JWT::ExpiredSignature when the token has expired' do
|
@@ -71,10 +52,14 @@ module JWT
|
|
71
52
|
end.to raise_error JWT::ExpiredSignature
|
72
53
|
end
|
73
54
|
|
74
|
-
it 'must allow some leeway in the expiration when configured' do
|
55
|
+
it 'must allow some leeway in the expiration when global leeway is configured' do
|
75
56
|
Verify.verify_expiration(payload, options.merge(leeway: 10))
|
76
57
|
end
|
77
58
|
|
59
|
+
it 'must allow some leeway in the expiration when exp_leeway is configured' do
|
60
|
+
Verify.verify_expiration(payload, options.merge(exp_leeway: 10))
|
61
|
+
end
|
62
|
+
|
78
63
|
it 'must be expired if the exp claim equals the current time' do
|
79
64
|
payload['exp'] = Time.now.to_i
|
80
65
|
|
@@ -82,6 +67,16 @@ module JWT
|
|
82
67
|
Verify.verify_expiration(payload, options)
|
83
68
|
end.to raise_error JWT::ExpiredSignature
|
84
69
|
end
|
70
|
+
|
71
|
+
context 'when leeway is not specified' do
|
72
|
+
let(:options) { {} }
|
73
|
+
|
74
|
+
it 'used a default leeway of 0' do
|
75
|
+
expect do
|
76
|
+
Verify.verify_expiration(payload, options)
|
77
|
+
end.to raise_error JWT::ExpiredSignature
|
78
|
+
end
|
79
|
+
end
|
85
80
|
end
|
86
81
|
|
87
82
|
context '.verify_iat(payload, options)' do
|
@@ -96,6 +91,10 @@ module JWT
|
|
96
91
|
Verify.verify_iat(payload.merge('iat' => (iat + 60)), options.merge(leeway: 70))
|
97
92
|
end
|
98
93
|
|
94
|
+
it 'must allow configured iat_leeway' do
|
95
|
+
Verify.verify_iat(payload.merge('iat' => (iat + 60)), options.merge(iat_leeway: 70))
|
96
|
+
end
|
97
|
+
|
99
98
|
it 'must properly handle integer times' do
|
100
99
|
Verify.verify_iat(payload.merge('iat' => Time.now.to_i), options)
|
101
100
|
end
|
@@ -119,20 +118,39 @@ module JWT
|
|
119
118
|
|
120
119
|
let(:invalid_token) { JWT.encode base_payload, payload[:secret] }
|
121
120
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
121
|
+
context 'when iss is a String' do
|
122
|
+
it 'must raise JWT::InvalidIssuerError when the configured issuer does not match the payload issuer' do
|
123
|
+
expect do
|
124
|
+
Verify.verify_iss(payload, options.merge(iss: 'mismatched-issuer'))
|
125
|
+
end.to raise_error JWT::InvalidIssuerError
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'must raise JWT::InvalidIssuerError when the payload does not include an issuer' do
|
129
|
+
expect do
|
130
|
+
Verify.verify_iss(base_payload, options.merge(iss: iss))
|
131
|
+
end.to raise_error(JWT::InvalidIssuerError, /received <none>/)
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'must allow a matching issuer to pass' do
|
135
|
+
Verify.verify_iss(payload, options.merge(iss: iss))
|
136
|
+
end
|
137
|
+
end
|
138
|
+
context 'when iss is an Array' do
|
139
|
+
it 'must raise JWT::InvalidIssuerError when no matching issuers in array' do
|
140
|
+
expect do
|
141
|
+
Verify.verify_iss(payload, options.merge(iss: %w[first second]))
|
142
|
+
end.to raise_error JWT::InvalidIssuerError
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'must raise JWT::InvalidIssuerError when the payload does not include an issuer' do
|
146
|
+
expect do
|
147
|
+
Verify.verify_iss(base_payload, options.merge(iss: %w[first second]))
|
148
|
+
end.to raise_error(JWT::InvalidIssuerError, /received <none>/)
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'must allow an array with matching issuer to pass' do
|
152
|
+
Verify.verify_iss(payload, options.merge(iss: ['first', iss, 'third']))
|
153
|
+
end
|
136
154
|
end
|
137
155
|
end
|
138
156
|
|
@@ -175,9 +193,13 @@ module JWT
|
|
175
193
|
end.to raise_error JWT::ImmatureSignature
|
176
194
|
end
|
177
195
|
|
178
|
-
it 'must allow some leeway in the token age when configured' do
|
196
|
+
it 'must allow some leeway in the token age when global leeway is configured' do
|
179
197
|
Verify.verify_not_before(payload, options.merge(leeway: 10))
|
180
198
|
end
|
199
|
+
|
200
|
+
it 'must allow some leeway in the token age when nbf_leeway is configured' do
|
201
|
+
Verify.verify_not_before(payload, options.merge(nbf_leeway: 10))
|
202
|
+
end
|
181
203
|
end
|
182
204
|
|
183
205
|
context '.verify_sub(payload, options)' do
|
data/spec/jwt_spec.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'jwt'
|
3
|
+
require 'jwt/encode'
|
3
4
|
require 'jwt/decode'
|
4
5
|
|
5
6
|
describe JWT do
|
@@ -18,13 +19,14 @@ describe JWT do
|
|
18
19
|
'ES384_public' => OpenSSL::PKey.read(File.read(File.join(CERT_PATH, 'ec384-public.pem'))),
|
19
20
|
'ES512_private' => OpenSSL::PKey.read(File.read(File.join(CERT_PATH, 'ec512-private.pem'))),
|
20
21
|
'ES512_public' => OpenSSL::PKey.read(File.read(File.join(CERT_PATH, 'ec512-public.pem'))),
|
21
|
-
'NONE' => '
|
22
|
-
'HS256' => '
|
23
|
-
'
|
24
|
-
'
|
25
|
-
'
|
26
|
-
'
|
27
|
-
'
|
22
|
+
'NONE' => 'eyJhbGciOiJub25lIn0.eyJ1c2VyX2lkIjoic29tZUB1c2VyLnRsZCJ9.',
|
23
|
+
'HS256' => 'eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoic29tZUB1c2VyLnRsZCJ9.kWOVtIOpWcG7JnyJG0qOkTDbOy636XrrQhMm_8JrRQ8',
|
24
|
+
'HS512256' => 'eyJhbGciOiJIUzUxMjI1NiJ9.eyJ1c2VyX2lkIjoic29tZUB1c2VyLnRsZCJ9.Ds_4ibvf7z4QOBoKntEjDfthy3WJ-3rKMspTEcHE2bA',
|
25
|
+
'HS384' => 'eyJhbGciOiJIUzM4NCJ9.eyJ1c2VyX2lkIjoic29tZUB1c2VyLnRsZCJ9.VuV4j4A1HKhWxCNzEcwc9qVF3frrEu-BRLzvYPkbWO0LENRGy5dOiBQ34remM3XH',
|
26
|
+
'HS512' => 'eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoic29tZUB1c2VyLnRsZCJ9.8zNtCBTJIZTHpZ-BkhR-6sZY1K85Nm5YCKqV3AxRdsBJDt_RR-REH2db4T3Y0uQwNknhrCnZGvhNHrvhDwV1kA',
|
27
|
+
'RS256' => 'eyJhbGciOiJSUzI1NiJ9.eyJ1c2VyX2lkIjoic29tZUB1c2VyLnRsZCJ9.eSXvWP4GViiwUALj_-qTxU68I1oM0XjgDsCZBBUri2Ghh9d75QkVDoZ_v872GaqunN5A5xcnBK0-cOq-CR6OwibgJWfOt69GNzw5RrOfQ2mz3QI3NYEq080nF69h8BeqkiaXhI24Q51joEgfa9aj5Y-oitLAmtDPYTm7vTcdGufd6AwD3_3jajKBwkh0LPSeMtbe_5EyS94nFoEF9OQuhJYjUmp7agsBVa8FFEjVw5jEgVqkvERSj5hSY4nEiCAomdVxIKBfykyi0d12cgjhI7mBFwWkPku8XIPGZ7N8vpiSLdM68BnUqIK5qR7NAhtvT7iyLFgOqhZNUQ6Ret5VpQ',
|
28
|
+
'RS384' => 'eyJhbGciOiJSUzM4NCJ9.eyJ1c2VyX2lkIjoic29tZUB1c2VyLnRsZCJ9.Sfgk56moPghtsjaP4so6tOy3I553mgwX-5gByMC6dX8lpeWgsxSeAd_K8IyO7u4lwYOL0DSftnqO1HEOuN1AKyBbDvaTXz3u2xNA2x4NYLdW4AZA6ritbYcKLO5BHTXw5ueMbtA1jjGXP0zI_aK2iJTMBmB8SCF88RYBUH01Tyf4PlLj98pGL-v3prZd6kZkIeRJ3326h04hslcB5HQKmgeBk24QNLIoIC-CD329HPjJ7TtGx01lj-ehTBnwVbBGzYFAyoalV5KgvL_MDOfWPr1OYHnR5s_Fm6_3Vg4u6lBljvHOrmv4Nfx7d8HLgbo8CwH4qn1wm6VQCtuDd-uhRg',
|
29
|
+
'RS512' => 'eyJhbGciOiJSUzUxMiJ9.eyJ1c2VyX2lkIjoic29tZUB1c2VyLnRsZCJ9.LIIAUEuCkGNdpYguOO5LoW4rZ7ED2POJrB0pmEAAchyTdIK4HKh1jcLxc6KyGwZv40njCgub3y72q6vcQTn7oD0zWFCVQRIDW1911Ii2hRNHuigiPUnrnZh1OQ6z65VZRU6GKs8omoBGU9vrClBU0ODqYE16KxYmE_0n4Xw2h3D_L1LF0IAOtDWKBRDa3QHwZRM9sHsHNsBuD5ye9KzDYN1YALXj64LBfA-DoCKfpVAm9NkRPOyzjR2X2C3TomOSJgqWIVHJucudKDDAZyEbO4RA5pI-UFYy1370p9bRajvtDyoBuLDCzoSkMyQ4L2DnLhx5CbWcnD7Cd3GUmnjjTA',
|
28
30
|
'ES256' => '',
|
29
31
|
'ES384' => '',
|
30
32
|
'ES512' => ''
|
@@ -58,9 +60,17 @@ describe JWT do
|
|
58
60
|
JWT.encode payload, nil, alg
|
59
61
|
end.to raise_error JWT::InvalidPayload
|
60
62
|
end
|
63
|
+
|
64
|
+
it 'should display a better error message if payload exp is not an Integer' do
|
65
|
+
payload['exp'] = Time.now.to_i.to_s
|
66
|
+
|
67
|
+
expect do
|
68
|
+
JWT.encode payload, nil, alg
|
69
|
+
end.to raise_error JWT::InvalidPayload
|
70
|
+
end
|
61
71
|
end
|
62
72
|
|
63
|
-
%w
|
73
|
+
%w[HS256 HS512256 HS384 HS512].each do |alg|
|
64
74
|
context "alg: #{alg}" do
|
65
75
|
it 'should generate a valid token' do
|
66
76
|
token = JWT.encode payload, data[:secret], alg
|
@@ -69,7 +79,7 @@ describe JWT do
|
|
69
79
|
end
|
70
80
|
|
71
81
|
it 'should decode a valid token' do
|
72
|
-
jwt_payload, header = JWT.decode data[alg], data[:secret]
|
82
|
+
jwt_payload, header = JWT.decode data[alg], data[:secret], true, algorithm: alg
|
73
83
|
|
74
84
|
expect(header['alg']).to eq alg
|
75
85
|
expect(jwt_payload).to eq payload
|
@@ -77,8 +87,8 @@ describe JWT do
|
|
77
87
|
|
78
88
|
it 'wrong secret should raise JWT::DecodeError' do
|
79
89
|
expect do
|
80
|
-
JWT.decode data[alg], 'wrong_secret'
|
81
|
-
end.to raise_error JWT::
|
90
|
+
JWT.decode data[alg], 'wrong_secret', true, algorithm: alg
|
91
|
+
end.to raise_error JWT::VerificationError
|
82
92
|
end
|
83
93
|
|
84
94
|
it 'wrong secret and verify = false should not raise JWT::DecodeError' do
|
@@ -89,7 +99,7 @@ describe JWT do
|
|
89
99
|
end
|
90
100
|
end
|
91
101
|
|
92
|
-
%w
|
102
|
+
%w[RS256 RS384 RS512].each do |alg|
|
93
103
|
context "alg: #{alg}" do
|
94
104
|
it 'should generate a valid token' do
|
95
105
|
token = JWT.encode payload, data[:rsa_private], alg
|
@@ -98,7 +108,7 @@ describe JWT do
|
|
98
108
|
end
|
99
109
|
|
100
110
|
it 'should decode a valid token' do
|
101
|
-
jwt_payload, header = JWT.decode data[alg], data[:rsa_public]
|
111
|
+
jwt_payload, header = JWT.decode data[alg], data[:rsa_public], true, algorithm: alg
|
102
112
|
|
103
113
|
expect(header['alg']).to eq alg
|
104
114
|
expect(jwt_payload).to eq payload
|
@@ -108,7 +118,7 @@ describe JWT do
|
|
108
118
|
key = OpenSSL::PKey.read File.read(File.join(CERT_PATH, 'rsa-2048-wrong-public.pem'))
|
109
119
|
|
110
120
|
expect do
|
111
|
-
JWT.decode data[alg], key
|
121
|
+
JWT.decode data[alg], key, true, algorithm: alg
|
112
122
|
end.to raise_error JWT::DecodeError
|
113
123
|
end
|
114
124
|
|
@@ -122,7 +132,7 @@ describe JWT do
|
|
122
132
|
end
|
123
133
|
end
|
124
134
|
|
125
|
-
%w
|
135
|
+
%w[ES256 ES384 ES512].each do |alg|
|
126
136
|
context "alg: #{alg}" do
|
127
137
|
before(:each) do
|
128
138
|
data[alg] = JWT.encode payload, data["#{alg}_private"], alg
|
@@ -131,14 +141,14 @@ describe JWT do
|
|
131
141
|
let(:wrong_key) { OpenSSL::PKey.read(File.read(File.join(CERT_PATH, 'ec256-wrong-public.pem'))) }
|
132
142
|
|
133
143
|
it 'should generate a valid token' do
|
134
|
-
jwt_payload, header = JWT.decode data[alg], data["#{alg}_public"]
|
144
|
+
jwt_payload, header = JWT.decode data[alg], data["#{alg}_public"], true, algorithm: alg
|
135
145
|
|
136
146
|
expect(header['alg']).to eq alg
|
137
147
|
expect(jwt_payload).to eq payload
|
138
148
|
end
|
139
149
|
|
140
150
|
it 'should decode a valid token' do
|
141
|
-
jwt_payload, header = JWT.decode data[alg], data["#{alg}_public"]
|
151
|
+
jwt_payload, header = JWT.decode data[alg], data["#{alg}_public"], true, algorithm: alg
|
142
152
|
|
143
153
|
expect(header['alg']).to eq alg
|
144
154
|
expect(jwt_payload).to eq payload
|
@@ -195,6 +205,14 @@ describe JWT do
|
|
195
205
|
JWT.decode token, data[:secret], true, algorithm: 'HS512'
|
196
206
|
end.not_to raise_error
|
197
207
|
end
|
208
|
+
|
209
|
+
it 'should raise JWT::IncorrectAlgorithm if no algorithm is provided' do
|
210
|
+
token = JWT.encode payload, data[:rsa_public].to_s, 'HS256'
|
211
|
+
|
212
|
+
expect do
|
213
|
+
JWT.decode token, data[:rsa_public], true
|
214
|
+
end.to raise_error JWT::IncorrectAlgorithm
|
215
|
+
end
|
198
216
|
end
|
199
217
|
|
200
218
|
context 'issuer claim' do
|
@@ -208,7 +226,7 @@ describe JWT do
|
|
208
226
|
|
209
227
|
it 'if verify_iss is set to false (default option) should not raise JWT::InvalidIssuerError' do
|
210
228
|
expect do
|
211
|
-
JWT.decode token, data[:secret], true, iss: iss
|
229
|
+
JWT.decode token, data[:secret], true, iss: iss, algorithm: 'HS256'
|
212
230
|
end.not_to raise_error
|
213
231
|
end
|
214
232
|
end
|
@@ -217,24 +235,23 @@ describe JWT do
|
|
217
235
|
context 'Base64' do
|
218
236
|
it 'urlsafe replace + / with - _' do
|
219
237
|
allow(Base64).to receive(:encode64) { 'string+with/non+url-safe/characters_' }
|
220
|
-
expect(JWT.base64url_encode('foo')).to eq('string-with_non-url-safe_characters_')
|
238
|
+
expect(JWT::Encode.base64url_encode('foo')).to eq('string-with_non-url-safe_characters_')
|
221
239
|
end
|
222
240
|
end
|
223
241
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
242
|
+
it 'should not verify token even if the payload has claims' do
|
243
|
+
head = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9'
|
244
|
+
load = 'eyJ1c2VyX2lkIjo1NCwiZXhwIjoxNTA0MzkwODA0fQ'
|
245
|
+
sign = 'Skpi6FfYMbZ-DwW9ocyRIosNMdPMAIWRLYxRO68GTQk'
|
228
246
|
|
229
|
-
|
230
|
-
[
|
231
|
-
|
232
|
-
|
233
|
-
end
|
234
|
-
end
|
247
|
+
expect do
|
248
|
+
JWT.decode([head, load, sign].join('.'), '', false)
|
249
|
+
end.not_to raise_error
|
250
|
+
end
|
235
251
|
|
236
|
-
|
237
|
-
|
238
|
-
|
252
|
+
it 'should not raise InvalidPayload exception if payload is an array' do
|
253
|
+
expect do
|
254
|
+
JWT.encode(['my', 'payload'], 'secret')
|
255
|
+
end.not_to raise_error
|
239
256
|
end
|
240
257
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,26 +2,23 @@ require 'rspec'
|
|
2
2
|
require 'simplecov'
|
3
3
|
require 'simplecov-json'
|
4
4
|
require 'codeclimate-test-reporter'
|
5
|
+
require 'codacy-coverage'
|
6
|
+
|
7
|
+
Codacy::Reporter.start
|
5
8
|
|
6
9
|
SimpleCov.configure do
|
7
10
|
root File.join(File.dirname(__FILE__), '..')
|
8
11
|
project_name 'Ruby JWT - Ruby JSON Web Token implementation'
|
9
|
-
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
|
10
|
-
SimpleCov::Formatter::HTMLFormatter,
|
11
|
-
SimpleCov::Formatter::JSONFormatter
|
12
|
-
])
|
13
|
-
|
14
12
|
add_filter 'spec'
|
15
13
|
end
|
16
14
|
|
17
15
|
SimpleCov.start if ENV['COVERAGE']
|
18
|
-
CodeClimate::TestReporter.start if ENV['CODECLIMATE_REPO_TOKEN']
|
19
16
|
|
20
17
|
CERT_PATH = File.join(File.dirname(__FILE__), 'fixtures', 'certs')
|
21
18
|
|
22
19
|
RSpec.configure do |config|
|
23
20
|
config.expect_with :rspec do |c|
|
24
|
-
c.syntax = [
|
21
|
+
c.syntax = %i[should expect]
|
25
22
|
end
|
26
23
|
|
27
24
|
config.run_all_when_everything_filtered = true
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jwt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Jeff Lindsay
|
8
7
|
- Tim Rudat
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2017-09-03 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: bundler
|
@@ -40,21 +39,21 @@ dependencies:
|
|
40
39
|
- !ruby/object:Gem::Version
|
41
40
|
version: '0'
|
42
41
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
42
|
+
name: rspec
|
44
43
|
requirement: !ruby/object:Gem::Requirement
|
45
44
|
requirements:
|
46
|
-
- - "
|
45
|
+
- - ">="
|
47
46
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
47
|
+
version: '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: '
|
54
|
+
version: '0'
|
56
55
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
56
|
+
name: simplecov
|
58
57
|
requirement: !ruby/object:Gem::Requirement
|
59
58
|
requirements:
|
60
59
|
- - ">="
|
@@ -68,7 +67,7 @@ dependencies:
|
|
68
67
|
- !ruby/object:Gem::Version
|
69
68
|
version: '0'
|
70
69
|
- !ruby/object:Gem::Dependency
|
71
|
-
name: simplecov
|
70
|
+
name: simplecov-json
|
72
71
|
requirement: !ruby/object:Gem::Requirement
|
73
72
|
requirements:
|
74
73
|
- - ">="
|
@@ -82,7 +81,7 @@ dependencies:
|
|
82
81
|
- !ruby/object:Gem::Version
|
83
82
|
version: '0'
|
84
83
|
- !ruby/object:Gem::Dependency
|
85
|
-
name:
|
84
|
+
name: codeclimate-test-reporter
|
86
85
|
requirement: !ruby/object:Gem::Requirement
|
87
86
|
requirements:
|
88
87
|
- - ">="
|
@@ -96,7 +95,21 @@ dependencies:
|
|
96
95
|
- !ruby/object:Gem::Version
|
97
96
|
version: '0'
|
98
97
|
- !ruby/object:Gem::Dependency
|
99
|
-
name:
|
98
|
+
name: codacy-coverage
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rbnacl
|
100
113
|
requirement: !ruby/object:Gem::Requirement
|
101
114
|
requirements:
|
102
115
|
- - ">="
|
@@ -117,7 +130,9 @@ extensions: []
|
|
117
130
|
extra_rdoc_files: []
|
118
131
|
files:
|
119
132
|
- ".codeclimate.yml"
|
133
|
+
- ".ebert.yml"
|
120
134
|
- ".gitignore"
|
135
|
+
- ".reek.yml"
|
121
136
|
- ".rspec"
|
122
137
|
- ".rubocop.yml"
|
123
138
|
- ".travis.yml"
|
@@ -129,8 +144,11 @@ files:
|
|
129
144
|
- Rakefile
|
130
145
|
- lib/jwt.rb
|
131
146
|
- lib/jwt/decode.rb
|
147
|
+
- lib/jwt/default_options.rb
|
148
|
+
- lib/jwt/encode.rb
|
132
149
|
- lib/jwt/error.rb
|
133
|
-
- lib/jwt/
|
150
|
+
- lib/jwt/security_utils.rb
|
151
|
+
- lib/jwt/signature.rb
|
134
152
|
- lib/jwt/verify.rb
|
135
153
|
- lib/jwt/version.rb
|
136
154
|
- ruby-jwt.gemspec
|
@@ -170,7 +188,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
170
188
|
requirements:
|
171
189
|
- - ">="
|
172
190
|
- !ruby/object:Gem::Version
|
173
|
-
version: '
|
191
|
+
version: '2.1'
|
174
192
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
193
|
requirements:
|
176
194
|
- - ">="
|
@@ -178,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
178
196
|
version: '0'
|
179
197
|
requirements: []
|
180
198
|
rubyforge_project:
|
181
|
-
rubygems_version: 2.6.
|
199
|
+
rubygems_version: 2.6.13
|
182
200
|
signing_key:
|
183
201
|
specification_version: 4
|
184
202
|
summary: JSON Web Token implementation in Ruby
|
data/lib/jwt/json.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'json'
|
3
|
-
|
4
|
-
module JWT
|
5
|
-
# JSON fallback implementation or ruby 1.8.x
|
6
|
-
module Json
|
7
|
-
def decode_json(encoded)
|
8
|
-
JSON.parse(encoded)
|
9
|
-
rescue JSON::ParserError
|
10
|
-
raise JWT::DecodeError, 'Invalid segment encoding'
|
11
|
-
end
|
12
|
-
|
13
|
-
def encode_json(raw)
|
14
|
-
JSON.generate(raw)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|