@@ -59,39 +59,36 @@ class JWT:
59
59
:param str algo: Encryption algorithm used for claims. Can be None.
60
60
61
61
"""
62
-
63
62
@staticmethod
64
63
def validate (jwt ):
65
- """Validates a provided JWT. Does not support nested signing.
64
+ """Validates a provided JWT. Does not support validating
65
+ nested signing. Returns JOSE Header and claim set.
66
66
:param str jwt: JSON Web Token.
67
67
:returns: The message's decoded JOSE header and claims.
68
68
:rtype: tuple
69
69
"""
70
70
# Verify JWT contains at least one period ('.')
71
71
if jwt .find ("." ) == - 1 :
72
- raise ValueError ("JWT must have at least one period" )
73
- # Separate the encoded JOSE Header
74
- jose_header = jwt .split ("." )[0 ]
75
- # Decode JOSE Header
72
+ raise ValueError ("ProvidedJWT must have at least one period" )
73
+ # Attempt to decode JOSE header
76
74
try :
77
- jose_header = STRING_TOOLS .urlsafe_b64decode (jose_header )
75
+ jose_header = STRING_TOOLS .urlsafe_b64decode (jwt . split ( "." )[ 0 ] )
78
76
except UnicodeError :
79
- raise UnicodeError ("Invalid JOSE Header encoding." )
80
- if "type" not in jose_header :
77
+ raise UnicodeError ("Unable to decode JOSE header." )
78
+ # Check for typ and alg in decoded JOSE header
79
+ if "typ" not in jose_header :
81
80
raise TypeError ("JOSE Header does not contain required type key." )
82
81
if "alg" not in jose_header :
83
- raise TypeError ("Jose Header does not contain required alg key." )
84
- # Separate encoded claim set
85
- claims = jwt .split ("." )[1 ]
82
+ raise TypeError ("Jose Header does not contain an alg key." )
83
+ # Attempt to decode claim set
86
84
try :
87
- claims = json .loads (STRING_TOOLS .urlsafe_b64decode (claims ))
85
+ claims = json .loads (STRING_TOOLS .urlsafe_b64decode (jwt . split ( "." )[ 1 ] ))
88
86
except UnicodeError :
89
87
raise UnicodeError ("Invalid claims encoding." )
90
88
if not hasattr (claims , "keys" ):
91
89
raise TypeError ("Provided claims is not a JSON dict. object" )
92
90
return (jose_header , claims )
93
91
94
-
95
92
@staticmethod
96
93
def generate (claims , private_key_data = None , algo = None ):
97
94
"""Generates and returns a new JSON Web Token.
@@ -108,15 +105,16 @@ def generate(claims, private_key_data=None, algo=None):
108
105
# https://tools.ietf.org/html/rfc7519#section-5
109
106
jose_header = {"typ" : "JWT" , "alg" : algo }
110
107
payload = "{}.{}" .format (
111
- string . b42_urlsafe_encode (json .dumps (jose_header ).encode ("utf-8" )),
112
- string . b42_urlsafe_encode (json .dumps (claims ).encode ("utf-8" )),
108
+ STRING_TOOLS . urlsafe_b64encode (json .dumps (jose_header ).encode ("utf-8" )),
109
+ STRING_TOOLS . urlsafe_b64encode (json .dumps (claims ).encode ("utf-8" )),
113
110
)
114
111
# Compute the signature
115
112
if algo == "none" :
116
113
jwt = "{}.{}" .format (jose_header , claims )
117
114
elif algo == "RS256" or algo == "RS384" or algo == "RS512" or algo == "RSA" :
118
115
#sig = sign(payload, priv_key, "SHA-256")
119
- signature = string .b42_urlsafe_encode (sign (payload , priv_key , "SHA-256" ))
116
+ signature = STRING_TOOLS .urlsafe_b64encode (
117
+ sign (payload , priv_key , "SHA-256" ))
120
118
jwt = payload + "." + signature
121
119
else :
122
120
raise TypeError (
@@ -149,7 +147,8 @@ def urlsafe_b64encode(payload):
149
147
:param bytes payload: bytes-like object.
150
148
"""
151
149
return STRING_TOOLS .translate (
152
- b2a_base64 (payload )[:- 1 ].decode ("utf-8" ), {ord ("+" ): "-" , ord ("/" ): "_" }
150
+ b2a_base64 (payload )[
151
+ :- 1 ].decode ("utf-8" ), {ord ("+" ): "-" , ord ("/" ): "_" }
153
152
)
154
153
155
154
@staticmethod
@@ -168,7 +167,8 @@ def _bytes_from_decode_data(str_data):
168
167
try :
169
168
return str_data .encode ("ascii" )
170
169
except :
171
- raise ValueError ("string argument should contain only ASCII characters" )
170
+ raise ValueError (
171
+ "string argument should contain only ASCII characters" )
172
172
elif isinstance (str_data , bit_types ):
173
173
return str_data
174
174
else :
0 commit comments