import base64
import copy
import hmac
import json
import time
class Jwt():
def __init__(self
):
pass
@
staticmethod
def b64encode(j_s
):
return base64
.urlsafe_b64encode
(j_s
).replace
(b
'=',b
'')
@
staticmethod
def b64decode(b_s
):
rem
=len(b_s
)%4
if rem
>0:
b_s
+= b
'='*(4-rem
)
return base64
.urlsafe_b64decode
(b_s
)
@
staticmethod
def encode(payload
,key
,exp
=300):
header
={'alg':'Hs256','ytp':'Jwt'}
header_json
=json
.dumps
(header
,sort_keys
=True,separators
=(',',':'))
header_bs
=Jwt
.b64encode
(header_json
.encode
())
my_payload
=copy
.deepcopy
(payload
)
my_payload
['exp']=time
.time
()+int(exp
)
payload_json
=json
.dumps
(my_payload
,sort_keys
=True,separators
=(',',':'))
payload_bs
=Jwt
.b64encode
(payload_json
.encode
())
if isinstance(key
,str):
key
=key
.encode
()
hm
=hmac
.new
(key
,header_bs
+ b
'.' +payload_bs
, digestmod
='SHA256')
hm_bs
=Jwt
.b64encode
(hm
.digest
())
return header_bs
+ b
'.' + payload_bs
+ b
'.' +hm_bs
@
staticmethod
def decode(jwt_s
,key
):
header_bs
,payload_bs
,sign_bs
=jwt_s
.split
(b
'.')
if isinstance(key
,str):
key
=key
.encode
()
hm
=hmac
.new
(key
,header_bs
+ b
'.' + payload_bs
, digestmod
='SHA256')
new_sign_bs
=Jwt
.b64encode
(hm
.digest
())
if new_sign_bs
!= sign_bs
:
raise('不正确')
payload_json
= Jwt
.b64decode
(payload_bs
)
payload
= json
.loads
(payload_json
)
exp
= payload
['exp']
now_t
=time
.time
()
if now_t
> exp
:
raise ('已经过期')
return payload
if __name__
== '__main__':
s
=Jwt
.encode
({'username':'xiaoerlang'},'123456',100)
print(s
)
d
=Jwt
.decode
(s
,'123456')
print(d
)
我自己使用时的结果:
b
'eyJhbGciOiJIczI1NiIsInl0cCI6Ikp3dCJ9.eyJleHAiOjE1NzI1MjM2MDcuNDY5NjU5MywidXNlcm5hbWUiOiJ4aWFvZXJsYW5nIn0.0RDRL-Jgb7-q7UO46LT6W5DG3l-DfqSZ4k15hLqfdrM'
{'exp': 1572523607.4696593, 'username': 'xiaoerlang'}
以上结果仅凭参考,由于时间的不同生成的结果也不同。为了进一步验证您的结果是否正确,可以使用JWT官网jtw官网进行结果验证。
转载请注明原文地址: https://mac.8miu.com/read-495254.html