diff options
author | wil paredes <code@dystedium.com> | 2014-02-07 11:58:37 -0800 |
---|---|---|
committer | wil paredes <code@dystedium.com> | 2014-02-07 11:58:37 -0800 |
commit | c7fb44820506c99df2d48a81660e501e9716e845 (patch) | |
tree | e95128236b244f63cb7c307a2e6e218c22658eaa | |
parent | b87bad733d4b2eef81967f98602cfdbb0997fb72 (diff) | |
download | pyjwt-c7fb44820506c99df2d48a81660e501e9716e845.tar.gz |
add tests for load() and verify_signature()
-rw-r--r-- | tests/test_jwt.py | 75 |
1 files changed, 74 insertions, 1 deletions
diff --git a/tests/test_jwt.py b/tests/test_jwt.py index fb83136..4192068 100644 --- a/tests/test_jwt.py +++ b/tests/test_jwt.py @@ -62,12 +62,29 @@ class TestJWT(unittest.TestCase): decoded_payload = jwt.decode(example_jwt, example_secret) self.assertEqual(decoded_payload, example_payload) + def test_load_verify_valid_jwt(self): + example_payload = {"hello": "world"} + example_secret = "secret" + example_jwt = ( + b"eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9" + b".eyJoZWxsbyI6ICJ3b3JsZCJ9" + b".tvagLDLoaiJKxOKqpBXSEGy7SYSifZhjntgm9ctpyj8") + decoded_payload, signing_input, header, signature = jwt.load(example_jwt) + jwt.verify_signature(decoded_payload, signing_input, header, signature, example_secret) + self.assertEqual(decoded_payload, example_payload) + def test_allow_skip_verification(self): right_secret = 'foo' jwt_message = jwt.encode(self.payload, right_secret) decoded_payload = jwt.decode(jwt_message, verify=False) self.assertEqual(decoded_payload, self.payload) + def test_load_no_verification(self): + right_secret = 'foo' + jwt_message = jwt.encode(self.payload, right_secret) + decoded_payload, signing_input, header, signature = jwt.load(jwt_message) + self.assertEqual(decoded_payload, self.payload) + def test_no_secret(self): right_secret = 'foo' jwt_message = jwt.encode(self.payload, right_secret) @@ -75,6 +92,14 @@ class TestJWT(unittest.TestCase): with self.assertRaises(jwt.DecodeError): jwt.decode(jwt_message) + def test_verify_signature_no_secret(self): + right_secret = 'foo' + jwt_message = jwt.encode(self.payload, right_secret) + decoded_payload, signing_input, header, signature = jwt.load(jwt_message) + + with self.assertRaises(jwt.DecodeError): + jwt.verify_signature(decoded_payload, signing_input, header, signature) + def test_invalid_crypto_alg(self): self.assertRaises(NotImplementedError, jwt.encode, self.payload, "secret", "HS1024") @@ -82,15 +107,25 @@ class TestJWT(unittest.TestCase): def test_unicode_secret(self): secret = u'\xc2' jwt_message = jwt.encode(self.payload, secret) + decoded_payload = jwt.decode(jwt_message, secret) self.assertEqual(decoded_payload, self.payload) + decoded_payload, signing_input, header, signature = jwt.load(jwt_message) + jwt.verify_signature(decoded_payload, signing_input, header, signature, secret) + self.assertEqual(decoded_payload, self.payload) + def test_nonascii_secret(self): secret = '\xc2' # char value that ascii codec cannot decode jwt_message = jwt.encode(self.payload, secret) + decoded_payload = jwt.decode(jwt_message, secret) self.assertEqual(decoded_payload, self.payload) + decoded_payload, signing_input, header, signature = jwt.load(jwt_message) + jwt.verify_signature(decoded_payload, signing_input, header, signature, secret) + self.assertEqual(decoded_payload, self.payload) + def test_decode_unicode_value(self): example_payload = {"hello": "world"} example_secret = "secret" @@ -100,6 +135,8 @@ class TestJWT(unittest.TestCase): ".tvagLDLoaiJKxOKqpBXSEGy7SYSifZhjntgm9ctpyj8") decoded_payload = jwt.decode(example_jwt, example_secret) self.assertEqual(decoded_payload, example_payload) + decoded_payload, signing_input, header, signature = jwt.load(example_jwt) + self.assertEqual(decoded_payload, example_payload) def test_decode_invalid_header_padding(self): example_jwt = ( @@ -108,6 +145,8 @@ class TestJWT(unittest.TestCase): ".tvagLDLoaiJKxOKqpBXSEGy7SYSifZhjntgm9ctpyj8") example_secret = "secret" with self.assertRaises(jwt.DecodeError): + jwt.load(example_jwt) + with self.assertRaises(jwt.DecodeError): jwt.decode(example_jwt, example_secret) def test_decode_invalid_header_string(self): @@ -117,6 +156,8 @@ class TestJWT(unittest.TestCase): ".tvagLDLoaiJKxOKqpBXSEGy7SYSifZhjntgm9ctpyj8") example_secret = "secret" with self.assertRaisesRegexp(jwt.DecodeError, "Invalid header string"): + jwt.load(example_jwt) + with self.assertRaisesRegexp(jwt.DecodeError, "Invalid header string"): jwt.decode(example_jwt, example_secret) def test_decode_invalid_payload_padding(self): @@ -126,6 +167,8 @@ class TestJWT(unittest.TestCase): ".tvagLDLoaiJKxOKqpBXSEGy7SYSifZhjntgm9ctpyj8") example_secret = "secret" with self.assertRaises(jwt.DecodeError): + jwt.load(example_jwt) + with self.assertRaises(jwt.DecodeError): jwt.decode(example_jwt, example_secret) def test_decode_invalid_payload_string(self): @@ -136,6 +179,9 @@ class TestJWT(unittest.TestCase): example_secret = "secret" with self.assertRaisesRegexp(jwt.DecodeError, "Invalid payload string"): + jwt.load(example_jwt) + with self.assertRaisesRegexp(jwt.DecodeError, + "Invalid payload string"): jwt.decode(example_jwt, example_secret) def test_decode_invalid_crypto_padding(self): @@ -145,33 +191,51 @@ class TestJWT(unittest.TestCase): ".aatvagLDLoaiJKxOKqpBXSEGy7SYSifZhjntgm9ctpyj8") example_secret = "secret" with self.assertRaises(jwt.DecodeError): + jwt.load(example_jwt) + with self.assertRaises(jwt.DecodeError): jwt.decode(example_jwt, example_secret) def test_decode_with_expiration(self): self.payload['exp'] = utc_timestamp() - 1 secret = 'secret' jwt_message = jwt.encode(self.payload, secret) + with self.assertRaises(jwt.ExpiredSignature): jwt.decode(jwt_message, secret) + decoded_payload, signing_input, header, signature = jwt.load(jwt_message) + with self.assertRaises(jwt.ExpiredSignature): + jwt.verify_signature(decoded_payload, signing_input, header, signature, secret) + def test_decode_skip_expiration_verification(self): self.payload['exp'] = time.time() - 1 secret = 'secret' jwt_message = jwt.encode(self.payload, secret) + jwt.decode(jwt_message, secret, verify_expiration=False) + decoded_payload, signing_input, header, signature = jwt.load(jwt_message) + jwt.verify_signature(decoded_payload, signing_input, header, signature, secret, verify_expiration=False) + def test_decode_with_expiration_with_leeway(self): self.payload['exp'] = utc_timestamp() - 2 secret = 'secret' jwt_message = jwt.encode(self.payload, secret) + decoded_payload, signing_input, header, signature = jwt.load(jwt_message) + # With 3 seconds leeway, should be ok jwt.decode(jwt_message, secret, leeway=3) - # With 1 secondes, should fail + jwt.verify_signature(decoded_payload, signing_input, header, signature, secret, leeway=3) + + # With 1 second, should fail with self.assertRaises(jwt.ExpiredSignature): jwt.decode(jwt_message, secret, leeway=1) + with self.assertRaises(jwt.ExpiredSignature): + jwt.verify_signature(decoded_payload, signing_input, header, signature, secret, leeway=1) + def test_encode_decode_with_rsa_sha256(self): try: from Crypto.PublicKey import RSA @@ -183,6 +247,9 @@ class TestJWT(unittest.TestCase): with open('tests/testkey.pub','r') as rsa_pub_file: pub_rsakey = RSA.importKey(rsa_pub_file.read()) assert jwt.decode(jwt_message, pub_rsakey) + + load_output = jwt.load(jwt_message) + jwt.verify_signature(key=pub_rsakey, *load_output) except ImportError: pass @@ -197,6 +264,9 @@ class TestJWT(unittest.TestCase): with open('tests/testkey.pub','r') as rsa_pub_file: pub_rsakey = RSA.importKey(rsa_pub_file.read()) assert jwt.decode(jwt_message, pub_rsakey) + + load_output = jwt.load(jwt_message) + jwt.verify_signature(key=pub_rsakey, *load_output) except ImportError: pass @@ -211,6 +281,9 @@ class TestJWT(unittest.TestCase): with open('tests/testkey.pub','r') as rsa_pub_file: pub_rsakey = RSA.importKey(rsa_pub_file.read()) assert jwt.decode(jwt_message, pub_rsakey) + + load_output = jwt.load(jwt_message) + jwt.verify_signature(key=pub_rsakey, *load_output) except ImportError: pass |