10
10
11
11
class DummyJwt (Jwt ):
12
12
"""Jwt implementation that allows setting arbitrary payload and headers for testing."""
13
- def __init__ (self , secret_key , issuer , subject = None , algorithm = 'HS256' , nbf = Jwt .GENERATE ,
14
- ttl = 3600 , valid_until = None , headers = None , payload = None ):
13
+
14
+ ALGORITHM = 'HS256'
15
+
16
+ def __init__ (self , secret_key , issuer , subject = None , algorithm = None ,
17
+ nbf = Jwt .GENERATE , ttl = 3600 , valid_until = None , headers = None ,
18
+ payload = None ):
15
19
super (DummyJwt , self ).__init__ (
16
20
secret_key = secret_key ,
17
21
issuer = issuer ,
18
22
subject = subject ,
19
- algorithm = algorithm ,
23
+ algorithm = algorithm or self . ALGORITHM ,
20
24
nbf = nbf ,
21
25
ttl = ttl ,
22
26
valid_until = valid_until
@@ -43,7 +47,7 @@ def assertJwtsEqual(self, jwt, key, expected_payload=None, expected_headers=None
43
47
expected_headers = expected_headers or {}
44
48
expected_payload = expected_payload or {}
45
49
46
- decoded_payload = jwt_lib .decode (jwt , key , verify = False )
50
+ decoded_payload = jwt_lib .decode (jwt , key , algorithms = [ "HS256" ], options = { "verify_signature" : False } )
47
51
decoded_headers = jwt_lib .get_unverified_header (jwt )
48
52
49
53
self .assertEqual (expected_headers , decoded_headers )
@@ -146,37 +150,11 @@ def test_encode_custom_nbf(self, time_mock):
146
150
expected_payload = {'iss' : 'issuer' , 'exp' : 10 , 'nbf' : 5 },
147
151
)
148
152
149
- @patch ('time.time' )
150
- def test_encode_custom_algorithm (self , time_mock ):
151
- time_mock .return_value = 0.0
152
-
153
- jwt = DummyJwt ('secret_key' , 'issuer' , algorithm = 'HS512' , headers = {}, payload = {})
154
-
155
- self .assertJwtsEqual (
156
- jwt .to_jwt (), 'secret_key' ,
157
- expected_headers = {'typ' : 'JWT' , 'alg' : 'HS512' },
158
- expected_payload = {'iss' : 'issuer' , 'exp' : 3600 , 'nbf' : 0 },
159
- )
160
-
161
- @patch ('time.time' )
162
- def test_encode_override_algorithm (self , time_mock ):
163
- time_mock .return_value = 0.0
164
-
165
- jwt = DummyJwt ('secret_key' , 'issuer' , algorithm = 'HS256' , headers = {}, payload = {})
166
-
167
- self .assertJwtsEqual (
168
- jwt .to_jwt (algorithm = 'HS512' ),
169
- 'secret_key' ,
170
- expected_headers = {'typ' : 'JWT' , 'alg' : 'HS512' },
171
- expected_payload = {'iss' : 'issuer' , 'exp' : 3600 , 'nbf' : 0 },
172
- )
173
-
174
153
@patch ('time.time' )
175
154
def test_encode_with_headers (self , time_mock ):
176
155
time_mock .return_value = 0.0
177
156
178
- jwt = DummyJwt ('secret_key' , 'issuer' , algorithm = 'HS256' , headers = {'sooper' : 'secret' },
179
- payload = {})
157
+ jwt = DummyJwt ('secret_key' , 'issuer' , headers = {'sooper' : 'secret' }, payload = {})
180
158
181
159
self .assertJwtsEqual (
182
160
jwt .to_jwt (), 'secret_key' ,
@@ -188,7 +166,7 @@ def test_encode_with_headers(self, time_mock):
188
166
def test_encode_with_payload (self , time_mock ):
189
167
time_mock .return_value = 0.0
190
168
191
- jwt = DummyJwt ('secret_key' , 'issuer' , algorithm = 'HS256' , payload = {'root' : 'true' })
169
+ jwt = DummyJwt ('secret_key' , 'issuer' , payload = {'root' : 'true' })
192
170
193
171
self .assertJwtsEqual (
194
172
jwt .to_jwt (), 'secret_key' ,
@@ -208,10 +186,6 @@ def test_encode_with_payload_and_headers(self, time_mock):
208
186
expected_payload = {'iss' : 'issuer' , 'exp' : 3600 , 'nbf' : 0 , 'pay' : 'me' },
209
187
)
210
188
211
- def test_encode_invalid_crypto_alg_fails (self ):
212
- jwt = DummyJwt ('secret_key' , 'issuer' , algorithm = 'PlzDontTouchAlgorithm' )
213
- self .assertRaises (NotImplementedError , jwt .to_jwt )
214
-
215
189
def test_encode_no_key_fails (self ):
216
190
jwt = DummyJwt (None , 'issuer' )
217
191
self .assertRaises (ValueError , jwt .to_jwt )
@@ -236,15 +210,18 @@ def test_encode_decode(self):
236
210
'sick' : 'sick' ,
237
211
}, decoded_jwt .payload )
238
212
213
+ def test_encode_decode_mismatched_algorithms (self ):
214
+ jwt = DummyJwt ('secret_key' , 'issuer' , algorithm = 'HS512' , subject = 'hey' , payload = {'sick' : 'sick' })
215
+ self .assertRaises (JwtDecodeError , Jwt .from_jwt , jwt .to_jwt ())
216
+
239
217
def test_decode_bad_secret (self ):
240
218
jwt = DummyJwt ('secret_key' , 'issuer' )
241
219
self .assertRaises (JwtDecodeError , Jwt .from_jwt , jwt .to_jwt (), 'letmeinplz' )
242
220
243
221
def test_decode_modified_jwt_fails (self ):
244
222
jwt = DummyJwt ('secret_key' , 'issuer' )
245
- example_jwt = jwt .to_jwt (). decode ( 'utf-8' )
223
+ example_jwt = jwt .to_jwt ()
246
224
example_jwt = 'ABC' + example_jwt [3 :]
247
- example_jwt = example_jwt .encode ('utf-8' )
248
225
249
226
self .assertRaises (JwtDecodeError , Jwt .from_jwt , example_jwt , 'secret_key' )
250
227
0 commit comments