@@ -62,35 +62,70 @@ def test_decodes_valid_jwt(self):
6262 decoded_payload = jwt .decode (example_jwt , example_secret )
6363 self .assertEqual (decoded_payload , example_payload )
6464
65+ def test_load_verify_valid_jwt (self ):
66+ example_payload = {"hello" : "world" }
67+ example_secret = "secret"
68+ example_jwt = (
69+ b"eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9"
70+ b".eyJoZWxsbyI6ICJ3b3JsZCJ9"
71+ b".tvagLDLoaiJKxOKqpBXSEGy7SYSifZhjntgm9ctpyj8" )
72+ decoded_payload , signing_input , header , signature = jwt .load (example_jwt )
73+ jwt .verify_signature (decoded_payload , signing_input , header , signature , example_secret )
74+ self .assertEqual (decoded_payload , example_payload )
75+
6576 def test_allow_skip_verification (self ):
6677 right_secret = 'foo'
6778 jwt_message = jwt .encode (self .payload , right_secret )
6879 decoded_payload = jwt .decode (jwt_message , verify = False )
6980 self .assertEqual (decoded_payload , self .payload )
7081
82+ def test_load_no_verification (self ):
83+ right_secret = 'foo'
84+ jwt_message = jwt .encode (self .payload , right_secret )
85+ decoded_payload , signing_input , header , signature = jwt .load (jwt_message )
86+ self .assertEqual (decoded_payload , self .payload )
87+
7188 def test_no_secret (self ):
7289 right_secret = 'foo'
7390 jwt_message = jwt .encode (self .payload , right_secret )
7491
7592 with self .assertRaises (jwt .DecodeError ):
7693 jwt .decode (jwt_message )
7794
95+ def test_verify_signature_no_secret (self ):
96+ right_secret = 'foo'
97+ jwt_message = jwt .encode (self .payload , right_secret )
98+ decoded_payload , signing_input , header , signature = jwt .load (jwt_message )
99+
100+ with self .assertRaises (jwt .DecodeError ):
101+ jwt .verify_signature (decoded_payload , signing_input , header , signature )
102+
78103 def test_invalid_crypto_alg (self ):
79104 self .assertRaises (NotImplementedError , jwt .encode , self .payload ,
80105 "secret" , "HS1024" )
81106
82107 def test_unicode_secret (self ):
83108 secret = u'\xc2 '
84109 jwt_message = jwt .encode (self .payload , secret )
110+
85111 decoded_payload = jwt .decode (jwt_message , secret )
86112 self .assertEqual (decoded_payload , self .payload )
87113
114+ decoded_payload , signing_input , header , signature = jwt .load (jwt_message )
115+ jwt .verify_signature (decoded_payload , signing_input , header , signature , secret )
116+ self .assertEqual (decoded_payload , self .payload )
117+
88118 def test_nonascii_secret (self ):
89119 secret = '\xc2 ' # char value that ascii codec cannot decode
90120 jwt_message = jwt .encode (self .payload , secret )
121+
91122 decoded_payload = jwt .decode (jwt_message , secret )
92123 self .assertEqual (decoded_payload , self .payload )
93124
125+ decoded_payload , signing_input , header , signature = jwt .load (jwt_message )
126+ jwt .verify_signature (decoded_payload , signing_input , header , signature , secret )
127+ self .assertEqual (decoded_payload , self .payload )
128+
94129 def test_decode_unicode_value (self ):
95130 example_payload = {"hello" : "world" }
96131 example_secret = "secret"
@@ -100,13 +135,17 @@ def test_decode_unicode_value(self):
100135 ".tvagLDLoaiJKxOKqpBXSEGy7SYSifZhjntgm9ctpyj8" )
101136 decoded_payload = jwt .decode (example_jwt , example_secret )
102137 self .assertEqual (decoded_payload , example_payload )
138+ decoded_payload , signing_input , header , signature = jwt .load (example_jwt )
139+ self .assertEqual (decoded_payload , example_payload )
103140
104141 def test_decode_invalid_header_padding (self ):
105142 example_jwt = (
106143 "aeyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9"
107144 ".eyJoZWxsbyI6ICJ3b3JsZCJ9"
108145 ".tvagLDLoaiJKxOKqpBXSEGy7SYSifZhjntgm9ctpyj8" )
109146 example_secret = "secret"
147+ with self .assertRaises (jwt .DecodeError ):
148+ jwt .load (example_jwt )
110149 with self .assertRaises (jwt .DecodeError ):
111150 jwt .decode (example_jwt , example_secret )
112151
@@ -116,6 +155,8 @@ def test_decode_invalid_header_string(self):
116155 ".eyJoZWxsbyI6ICJ3b3JsZCJ9"
117156 ".tvagLDLoaiJKxOKqpBXSEGy7SYSifZhjntgm9ctpyj8" )
118157 example_secret = "secret"
158+ with self .assertRaisesRegexp (jwt .DecodeError , "Invalid header string" ):
159+ jwt .load (example_jwt )
119160 with self .assertRaisesRegexp (jwt .DecodeError , "Invalid header string" ):
120161 jwt .decode (example_jwt , example_secret )
121162
@@ -125,6 +166,8 @@ def test_decode_invalid_payload_padding(self):
125166 ".aeyJoZWxsbyI6ICJ3b3JsZCJ9"
126167 ".tvagLDLoaiJKxOKqpBXSEGy7SYSifZhjntgm9ctpyj8" )
127168 example_secret = "secret"
169+ with self .assertRaises (jwt .DecodeError ):
170+ jwt .load (example_jwt )
128171 with self .assertRaises (jwt .DecodeError ):
129172 jwt .decode (example_jwt , example_secret )
130173
@@ -134,6 +177,9 @@ def test_decode_invalid_payload_string(self):
134177 ".eyJoZWxsb-kiOiAid29ybGQifQ=="
135178 ".tvagLDLoaiJKxOKqpBXSEGy7SYSifZhjntgm9ctpyj8" )
136179 example_secret = "secret"
180+ with self .assertRaisesRegexp (jwt .DecodeError ,
181+ "Invalid payload string" ):
182+ jwt .load (example_jwt )
137183 with self .assertRaisesRegexp (jwt .DecodeError ,
138184 "Invalid payload string" ):
139185 jwt .decode (example_jwt , example_secret )
@@ -144,34 +190,52 @@ def test_decode_invalid_crypto_padding(self):
144190 ".eyJoZWxsbyI6ICJ3b3JsZCJ9"
145191 ".aatvagLDLoaiJKxOKqpBXSEGy7SYSifZhjntgm9ctpyj8" )
146192 example_secret = "secret"
193+ with self .assertRaises (jwt .DecodeError ):
194+ jwt .load (example_jwt )
147195 with self .assertRaises (jwt .DecodeError ):
148196 jwt .decode (example_jwt , example_secret )
149197
150198 def test_decode_with_expiration (self ):
151199 self .payload ['exp' ] = utc_timestamp () - 1
152200 secret = 'secret'
153201 jwt_message = jwt .encode (self .payload , secret )
202+
154203 with self .assertRaises (jwt .ExpiredSignature ):
155204 jwt .decode (jwt_message , secret )
156205
206+ decoded_payload , signing_input , header , signature = jwt .load (jwt_message )
207+ with self .assertRaises (jwt .ExpiredSignature ):
208+ jwt .verify_signature (decoded_payload , signing_input , header , signature , secret )
209+
157210 def test_decode_skip_expiration_verification (self ):
158211 self .payload ['exp' ] = time .time () - 1
159212 secret = 'secret'
160213 jwt_message = jwt .encode (self .payload , secret )
214+
161215 jwt .decode (jwt_message , secret , verify_expiration = False )
162216
217+ decoded_payload , signing_input , header , signature = jwt .load (jwt_message )
218+ jwt .verify_signature (decoded_payload , signing_input , header , signature , secret , verify_expiration = False )
219+
163220 def test_decode_with_expiration_with_leeway (self ):
164221 self .payload ['exp' ] = utc_timestamp () - 2
165222 secret = 'secret'
166223 jwt_message = jwt .encode (self .payload , secret )
167224
225+ decoded_payload , signing_input , header , signature = jwt .load (jwt_message )
226+
168227 # With 3 seconds leeway, should be ok
169228 jwt .decode (jwt_message , secret , leeway = 3 )
170229
171- # With 1 secondes, should fail
230+ jwt .verify_signature (decoded_payload , signing_input , header , signature , secret , leeway = 3 )
231+
232+ # With 1 second, should fail
172233 with self .assertRaises (jwt .ExpiredSignature ):
173234 jwt .decode (jwt_message , secret , leeway = 1 )
174235
236+ with self .assertRaises (jwt .ExpiredSignature ):
237+ jwt .verify_signature (decoded_payload , signing_input , header , signature , secret , leeway = 1 )
238+
175239 def test_encode_decode_with_rsa_sha256 (self ):
176240 try :
177241 from Crypto .PublicKey import RSA
@@ -183,6 +247,9 @@ def test_encode_decode_with_rsa_sha256(self):
183247 with open ('tests/testkey.pub' ,'r' ) as rsa_pub_file :
184248 pub_rsakey = RSA .importKey (rsa_pub_file .read ())
185249 assert jwt .decode (jwt_message , pub_rsakey )
250+
251+ load_output = jwt .load (jwt_message )
252+ jwt .verify_signature (key = pub_rsakey , * load_output )
186253 except ImportError :
187254 pass
188255
@@ -197,6 +264,9 @@ def test_encode_decode_with_rsa_sha384(self):
197264 with open ('tests/testkey.pub' ,'r' ) as rsa_pub_file :
198265 pub_rsakey = RSA .importKey (rsa_pub_file .read ())
199266 assert jwt .decode (jwt_message , pub_rsakey )
267+
268+ load_output = jwt .load (jwt_message )
269+ jwt .verify_signature (key = pub_rsakey , * load_output )
200270 except ImportError :
201271 pass
202272
@@ -211,6 +281,9 @@ def test_encode_decode_with_rsa_sha512(self):
211281 with open ('tests/testkey.pub' ,'r' ) as rsa_pub_file :
212282 pub_rsakey = RSA .importKey (rsa_pub_file .read ())
213283 assert jwt .decode (jwt_message , pub_rsakey )
284+
285+ load_output = jwt .load (jwt_message )
286+ jwt .verify_signature (key = pub_rsakey , * load_output )
214287 except ImportError :
215288 pass
216289
0 commit comments