6
6
import base64
7
7
import hashlib
8
8
import hmac
9
- from six import text_type , binary_type , b
10
-
9
+ from six import text_type , b
11
10
# default text to binary representation conversion
12
11
def binary (txt ):
13
12
return txt .encode ('utf-8' )
13
+
14
14
try :
15
15
import json
16
16
except ImportError :
17
17
import simplejson as json
18
-
19
-
18
+
20
19
__all__ = ['encode' , 'decode' , 'DecodeError' ]
21
20
22
21
class DecodeError (Exception ): pass
@@ -34,24 +33,14 @@ def base64url_decode(input):
34
33
def base64url_encode (input ):
35
34
return base64 .urlsafe_b64encode (input ).decode ('utf-8' ).replace ('=' , '' )
36
35
37
- def header (jwt ):
38
- header_segment = jwt .split ('.' , 1 )[0 ]
39
- try :
40
- return json .loads (base64url_decode (header_segment ))
41
- except (ValueError , TypeError ):
42
- raise DecodeError ("Invalid header encoding" )
43
-
44
36
def encode (payload , key , algorithm = 'HS256' ):
45
37
segments = []
46
38
header = {"typ" : "JWT" , "alg" : algorithm }
47
- header_as_binary = binary (json .dumps (header ))
48
- segments .append (base64url_encode (header_as_binary ))
49
- payload_as_binary = binary (json .dumps (payload ))
50
- segments .append (base64url_encode (payload_as_binary ))
39
+ segments .append (base64url_encode (binary (json .dumps (header ))))
40
+ segments .append (base64url_encode (binary (json .dumps (payload ))))
51
41
signing_input = '.' .join (segments )
52
42
try :
53
- ascii_key = text_type (key ).encode ('utf8' )
54
- signature = signing_methods [algorithm ](binary (signing_input ), ascii_key )
43
+ signature = signing_methods [algorithm ](binary (signing_input ), binary (key ))
55
44
except KeyError :
56
45
raise NotImplementedError ("Algorithm not supported" )
57
46
segments .append (base64url_encode (signature ))
@@ -71,8 +60,7 @@ def decode(jwt, key='', verify=True):
71
60
raise DecodeError ("Invalid segment encoding" )
72
61
if verify :
73
62
try :
74
- ascii_key = key
75
- if not signature == signing_methods [header ['alg' ]](binary (signing_input ), binary (ascii_key )):
63
+ if not signature == signing_methods [header ['alg' ]](binary (signing_input ), binary (key )):
76
64
raise DecodeError ("Signature verification failed" )
77
65
except KeyError :
78
66
raise DecodeError ("Algorithm not supported" )
0 commit comments