|
7 | 7 | let(:payload) { { data: 'test' } } |
8 | 8 |
|
9 | 9 | it 'NONE' do |
10 | | - token = JWT.encode payload, nil, 'none' |
11 | | - decoded_token = JWT.decode token, nil, false |
12 | | - |
13 | | - expect(token).to eq 'eyJhbGciOiJub25lIn0.eyJkYXRhIjoidGVzdCJ9.' |
14 | | - expect(decoded_token).to eq [ |
15 | | - { 'data' => 'test' }, |
16 | | - { 'alg' => 'none' } |
17 | | - ] |
| 10 | + token = JWT.encode(payload, nil, 'none') |
| 11 | + decoded_token = JWT.decode(token, nil, false) |
| 12 | + |
| 13 | + expect(token).to eq('eyJhbGciOiJub25lIn0.eyJkYXRhIjoidGVzdCJ9.') |
| 14 | + expect(decoded_token).to eq([{ 'data' => 'test' }, { 'alg' => 'none' }]) |
18 | 15 | end |
19 | 16 |
|
20 | 17 | it 'decodes with HMAC algorithm with secret key' do |
21 | | - token = JWT.encode payload, 'my$ecretK3y', 'HS256' |
22 | | - decoded_token = JWT.decode token, 'my$ecretK3y', false |
23 | | - |
24 | | - expect(token).to eq 'eyJhbGciOiJIUzI1NiJ9.eyJkYXRhIjoidGVzdCJ9.pNIWIL34Jo13LViZAJACzK6Yf0qnvT_BuwOxiMCPE-Y' |
25 | | - expect(decoded_token).to eq [ |
26 | | - { 'data' => 'test' }, |
27 | | - { 'alg' => 'HS256' } |
28 | | - ] |
| 18 | + token = JWT.encode(payload, 'my$ecretK3y', 'HS256') |
| 19 | + decoded_token = JWT.decode(token, 'my$ecretK3y', false) |
| 20 | + |
| 21 | + expect(token).to eq('eyJhbGciOiJIUzI1NiJ9.eyJkYXRhIjoidGVzdCJ9.pNIWIL34Jo13LViZAJACzK6Yf0qnvT_BuwOxiMCPE-Y') |
| 22 | + expect(decoded_token).to eq([{ 'data' => 'test' }, { 'alg' => 'HS256' }]) |
29 | 23 | end |
30 | 24 |
|
31 | 25 | it 'RSA' do |
32 | | - rsa_private = OpenSSL::PKey::RSA.generate 2048 |
| 26 | + rsa_private = OpenSSL::PKey::RSA.generate(2048) |
33 | 27 | rsa_public = rsa_private.public_key |
34 | 28 |
|
35 | | - token = JWT.encode payload, rsa_private, 'RS256' |
36 | | - decoded_token = JWT.decode token, rsa_public, true, algorithm: 'RS256' |
| 29 | + token = JWT.encode(payload, rsa_private, 'RS256') |
| 30 | + decoded_token = JWT.decode(token, rsa_public, true, algorithm: 'RS256') |
37 | 31 |
|
38 | | - expect(decoded_token).to eq [ |
39 | | - { 'data' => 'test' }, |
40 | | - { 'alg' => 'RS256' } |
41 | | - ] |
| 32 | + expect(decoded_token).to eq([{ 'data' => 'test' }, { 'alg' => 'RS256' }]) |
42 | 33 | end |
43 | 34 |
|
44 | 35 | it 'ECDSA' do |
45 | 36 | ecdsa_key = OpenSSL::PKey::EC.generate('prime256v1') |
46 | 37 |
|
47 | | - token = JWT.encode payload, ecdsa_key, 'ES256' |
48 | | - decoded_token = JWT.decode token, ecdsa_key, true, algorithm: 'ES256' |
| 38 | + token = JWT.encode(payload, ecdsa_key, 'ES256') |
| 39 | + decoded_token = JWT.decode(token, ecdsa_key, true, algorithm: 'ES256') |
49 | 40 |
|
50 | | - expect(decoded_token).to eq [ |
51 | | - { 'data' => 'test' }, |
52 | | - { 'alg' => 'ES256' } |
53 | | - ] |
| 41 | + expect(decoded_token).to eq([{ 'data' => 'test' }, { 'alg' => 'ES256' }]) |
54 | 42 | end |
55 | 43 |
|
56 | 44 | if Gem::Version.new(OpenSSL::VERSION) >= Gem::Version.new('2.1') |
57 | 45 | it 'RSASSA-PSS' do |
58 | | - rsa_private = OpenSSL::PKey::RSA.generate 2048 |
| 46 | + rsa_private = OpenSSL::PKey::RSA.generate(2048) |
59 | 47 | rsa_public = rsa_private.public_key |
60 | 48 |
|
61 | | - token = JWT.encode payload, rsa_private, 'PS256' |
62 | | - decoded_token = JWT.decode token, rsa_public, true, algorithm: 'PS256' |
| 49 | + token = JWT.encode(payload, rsa_private, 'PS256') |
| 50 | + decoded_token = JWT.decode(token, rsa_public, true, algorithm: 'PS256') |
63 | 51 |
|
64 | | - expect(decoded_token).to eq [ |
65 | | - { 'data' => 'test' }, |
66 | | - { 'alg' => 'PS256' } |
67 | | - ] |
| 52 | + expect(decoded_token).to eq([{ 'data' => 'test' }, { 'alg' => 'PS256' }]) |
68 | 53 | end |
69 | 54 | end |
70 | 55 | end |
|
77 | 62 | exp = Time.now.to_i + (4 * 3600) |
78 | 63 | exp_payload = { data: 'data', exp: exp } |
79 | 64 |
|
80 | | - token = JWT.encode exp_payload, hmac_secret, 'HS256' |
| 65 | + token = JWT.encode(exp_payload, hmac_secret, 'HS256') |
81 | 66 |
|
82 | 67 | expect do |
83 | | - JWT.decode token, hmac_secret, true, algorithm: 'HS256' |
| 68 | + JWT.decode(token, hmac_secret, true, algorithm: 'HS256') |
84 | 69 | end.not_to raise_error |
85 | 70 | end |
86 | 71 |
|
|
90 | 75 |
|
91 | 76 | exp_payload = { data: 'data', exp: exp } |
92 | 77 |
|
93 | | - token = JWT.encode exp_payload, hmac_secret, 'HS256' |
| 78 | + token = JWT.encode(exp_payload, hmac_secret, 'HS256') |
94 | 79 |
|
95 | 80 | expect do |
96 | | - JWT.decode token, hmac_secret, true, leeway: leeway, algorithm: 'HS256' |
| 81 | + JWT.decode(token, hmac_secret, true, leeway: leeway, algorithm: 'HS256') |
97 | 82 | end.not_to raise_error |
98 | 83 | end |
99 | 84 | end |
|
102 | 87 | it 'without leeway' do |
103 | 88 | nbf = Time.now.to_i - 3600 |
104 | 89 | nbf_payload = { data: 'data', nbf: nbf } |
105 | | - token = JWT.encode nbf_payload, hmac_secret, 'HS256' |
| 90 | + token = JWT.encode(nbf_payload, hmac_secret, 'HS256') |
106 | 91 |
|
107 | 92 | expect do |
108 | | - JWT.decode token, hmac_secret, true, algorithm: 'HS256' |
| 93 | + JWT.decode(token, hmac_secret, true, algorithm: 'HS256') |
109 | 94 | end.not_to raise_error |
110 | 95 | end |
111 | 96 |
|
112 | 97 | it 'with leeway' do |
113 | 98 | nbf = Time.now.to_i + 10 |
114 | 99 | leeway = 30 |
115 | 100 | nbf_payload = { data: 'data', nbf: nbf } |
116 | | - token = JWT.encode nbf_payload, hmac_secret, 'HS256' |
| 101 | + token = JWT.encode(nbf_payload, hmac_secret, 'HS256') |
117 | 102 |
|
118 | 103 | expect do |
119 | | - JWT.decode token, hmac_secret, true, leeway: leeway, algorithm: 'HS256' |
| 104 | + JWT.decode(token, hmac_secret, true, leeway: leeway, algorithm: 'HS256') |
120 | 105 | end.not_to raise_error |
121 | 106 | end |
122 | 107 | end |
|
125 | 110 | iss = 'My Awesome Company Inc. or https://my.awesome.website/' |
126 | 111 | iss_payload = { data: 'data', iss: iss } |
127 | 112 |
|
128 | | - token = JWT.encode iss_payload, hmac_secret, 'HS256' |
| 113 | + token = JWT.encode(iss_payload, hmac_secret, 'HS256') |
129 | 114 |
|
130 | 115 | expect do |
131 | | - JWT.decode token, hmac_secret, true, iss: iss, algorithm: 'HS256' |
| 116 | + JWT.decode(token, hmac_secret, true, iss: iss, algorithm: 'HS256') |
132 | 117 | end.not_to raise_error |
133 | 118 | end |
134 | 119 |
|
|
137 | 122 | aud = %w[Young Old] |
138 | 123 | aud_payload = { data: 'data', aud: aud } |
139 | 124 |
|
140 | | - token = JWT.encode aud_payload, hmac_secret, 'HS256' |
| 125 | + token = JWT.encode(aud_payload, hmac_secret, 'HS256') |
141 | 126 |
|
142 | 127 | expect do |
143 | | - JWT.decode token, hmac_secret, true, aud: %w[Old Young], verify_aud: true, algorithm: 'HS256' |
| 128 | + JWT.decode(token, hmac_secret, true, aud: %w[Old Young], verify_aud: true, algorithm: 'HS256') |
144 | 129 | end.not_to raise_error |
145 | 130 | end |
146 | 131 |
|
147 | 132 | it 'string' do |
148 | 133 | aud = 'Kids' |
149 | 134 | aud_payload = { data: 'data', aud: aud } |
150 | 135 |
|
151 | | - token = JWT.encode aud_payload, hmac_secret, 'HS256' |
| 136 | + token = JWT.encode(aud_payload, hmac_secret, 'HS256') |
152 | 137 |
|
153 | 138 | expect do |
154 | | - JWT.decode token, hmac_secret, true, aud: 'Kids', verify_aud: true, algorithm: 'HS256' |
| 139 | + JWT.decode(token, hmac_secret, true, aud: 'Kids', verify_aud: true, algorithm: 'HS256') |
155 | 140 | end.not_to raise_error |
156 | 141 | end |
157 | 142 | end |
|
163 | 148 | jti = Digest::MD5.hexdigest(jti_raw) |
164 | 149 | jti_payload = { data: 'data', iat: iat, jti: jti } |
165 | 150 |
|
166 | | - token = JWT.encode jti_payload, hmac_secret, 'HS256' |
| 151 | + token = JWT.encode(jti_payload, hmac_secret, 'HS256') |
167 | 152 |
|
168 | 153 | expect do |
169 | | - JWT.decode token, hmac_secret, true, verify_jti: true, algorithm: 'HS256' |
| 154 | + JWT.decode(token, hmac_secret, true, verify_jti: true, algorithm: 'HS256') |
170 | 155 | end.not_to raise_error |
171 | 156 | end |
172 | 157 |
|
|
175 | 160 | iat = Time.now.to_i |
176 | 161 | iat_payload = { data: 'data', iat: iat } |
177 | 162 |
|
178 | | - token = JWT.encode iat_payload, hmac_secret, 'HS256' |
| 163 | + token = JWT.encode(iat_payload, hmac_secret, 'HS256') |
179 | 164 |
|
180 | 165 | expect do |
181 | | - JWT.decode token, hmac_secret, true, verify_iat: true, algorithm: 'HS256' |
| 166 | + JWT.decode(token, hmac_secret, true, verify_iat: true, algorithm: 'HS256') |
182 | 167 | end.not_to raise_error |
183 | 168 | end |
184 | 169 |
|
185 | 170 | it 'with leeway' do |
186 | 171 | iat = Time.now.to_i - 7 |
187 | 172 | iat_payload = { data: 'data', iat: iat, leeway: 10 } |
188 | 173 |
|
189 | | - token = JWT.encode iat_payload, hmac_secret, 'HS256' |
| 174 | + token = JWT.encode(iat_payload, hmac_secret, 'HS256') |
190 | 175 |
|
191 | 176 | expect do |
192 | | - JWT.decode token, hmac_secret, true, verify_iat: true, algorithm: 'HS256' |
| 177 | + JWT.decode(token, hmac_secret, true, verify_iat: true, algorithm: 'HS256') |
193 | 178 | end.not_to raise_error |
194 | 179 | end |
195 | 180 | end |
|
198 | 183 | it 'with custom field' do |
199 | 184 | payload = { data: 'test' } |
200 | 185 |
|
201 | | - token = JWT.encode payload, nil, 'none', typ: 'JWT' |
202 | | - _, header = JWT.decode token, nil, false |
| 186 | + token = JWT.encode(payload, nil, 'none', typ: 'JWT') |
| 187 | + _, header = JWT.decode(token, nil, false) |
203 | 188 |
|
204 | | - expect(header['typ']).to eq 'JWT' |
| 189 | + expect(header['typ']).to eq('JWT') |
205 | 190 | end |
206 | 191 | end |
207 | 192 |
|
208 | 193 | it 'sub' do |
209 | 194 | sub = 'Subject' |
210 | 195 | sub_payload = { data: 'data', sub: sub } |
211 | 196 |
|
212 | | - token = JWT.encode sub_payload, hmac_secret, 'HS256' |
| 197 | + token = JWT.encode(sub_payload, hmac_secret, 'HS256') |
213 | 198 |
|
214 | 199 | expect do |
215 | | - JWT.decode token, hmac_secret, true, { sub: sub, verify_sub: true, algorithm: 'HS256' } |
| 200 | + JWT.decode(token, hmac_secret, true, { sub: sub, verify_sub: true, algorithm: 'HS256' }) |
216 | 201 | end.not_to raise_error |
217 | 202 |
|
218 | 203 | expect do |
219 | | - JWT.decode token, hmac_secret, true, { sub: 'sub', verify_sub: true, algorithm: 'HS256' } |
| 204 | + JWT.decode(token, hmac_secret, true, { sub: 'sub', verify_sub: true, algorithm: 'HS256' }) |
220 | 205 | end.to raise_error(JWT::InvalidSubError) |
221 | 206 |
|
222 | 207 | expect do |
223 | | - JWT.decode token, hmac_secret, true, { 'sub' => 'sub', verify_sub: true, algorithm: 'HS256' } |
| 208 | + JWT.decode(token, hmac_secret, true, { 'sub' => 'sub', verify_sub: true, algorithm: 'HS256' }) |
224 | 209 | end.not_to raise_error |
225 | 210 | end |
226 | 211 |
|
227 | 212 | it 'required_claims' do |
228 | 213 | payload = { data: 'test' } |
229 | 214 |
|
230 | | - token = JWT.encode payload, hmac_secret, 'HS256' |
| 215 | + token = JWT.encode(payload, hmac_secret, 'HS256') |
231 | 216 |
|
232 | 217 | expect do |
233 | | - JWT.decode token, hmac_secret, true, required_claims: ['exp'], algorithm: 'HS256' |
| 218 | + JWT.decode(token, hmac_secret, true, required_claims: ['exp'], algorithm: 'HS256') |
234 | 219 | end.to raise_error(JWT::MissingRequiredClaim) |
235 | 220 |
|
236 | 221 | expect do |
237 | | - JWT.decode token, hmac_secret, true, required_claims: ['data'], algorithm: 'HS256' |
| 222 | + JWT.decode(token, hmac_secret, true, required_claims: ['data'], algorithm: 'HS256') |
238 | 223 | end.not_to raise_error |
239 | 224 | end |
240 | 225 |
|
|
244 | 229 |
|
245 | 230 | secrets = { issuers.first => hmac_secret, issuers.last => 'hmac_secret2' } |
246 | 231 |
|
247 | | - token = JWT.encode iss_payload, hmac_secret, 'HS256' |
| 232 | + token = JWT.encode(iss_payload, hmac_secret, 'HS256') |
248 | 233 |
|
249 | 234 | expect do |
250 | 235 | # Add iss to the validation to check if the token has been manipulated |
|
0 commit comments