summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwil paredes <code@dystedium.com>2014-02-07 11:58:37 -0800
committerwil paredes <code@dystedium.com>2014-02-07 11:58:37 -0800
commitc7fb44820506c99df2d48a81660e501e9716e845 (patch)
treee95128236b244f63cb7c307a2e6e218c22658eaa
parentb87bad733d4b2eef81967f98602cfdbb0997fb72 (diff)
downloadpyjwt-c7fb44820506c99df2d48a81660e501e9716e845.tar.gz
add tests for load() and verify_signature()
-rw-r--r--tests/test_jwt.py75
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