一,不用借助jwt模块,python 实现jwt HS256加密
import hashlib
import json
import base64
import hmac
import time
def base64url_encode(input):
return base64.urlsafe_b64encode(input).replace(b'=', b'')
def sign(self, msg, key):
return hmac.new(key, msg, self.hash_alg).digest().decode('utf-8')
segments = []
header = {'type': 'sign', 'alg': 'HS256'}
json_header = json.dumps(
header,
separators=(',', ':')
).encode('utf-8')
payload = {'timestamp': time.time()}
payload = json.dumps(
payload,
separators=(',', ':')
).encode('utf-8')
segments.append(base64url_encode(json_header))
segments.append(base64url_encode(payload))
signing_input = b'.'.join(segments)
print(signing_input)
signature = hmac.new('iospl4xn1ccrgr4p5u7wkvcnsnz42uxgbj07vvmx'.encode('utf-8'), signing_input, hashlib.sha256).digest()
segments.append(base64url_encode(signature))
r = b'.'.join(segments)
print(r.decode('utf-8'))
二,借助JWT模块加密
import jwt
class JwtToken(object):
_salt = '-)t&-j=^)xjy+=^nr*(#xj-ql+zmrt8o1rvon8v@^*wf742%f*'
_expire_message = dict(code=1200, msg="token 已经失效")
_unknown_error_message = dict(code=4200, msg="token 解析失败")
@classmethod
def generate_token(cls, payload: dict) -> str:
headers = dict(typ="jwt", alg="HS256")
resut = jwt.encode(payload=payload, key=cls._salt, algorithm="HS256",headers=headers).decode('utf-8')
return resut
@classmethod
def parse_token(cls, token: str) -> tuple:
verify_status = False
try:
payload_data = jwt.decode(token, cls._salt, algorithms=['HS256'])
verify_status = True
except jwt.ExpiredSignatureError:
payload_data = cls._expire_message
except Exception as _err:
payload_data = cls._unknown_error_message
return verify_status, payload_data
'''
jwt.encode(
payload,
key,
api_settings.JWT_ALGORITHM
).decode('utf-8')
'''
if __name__ == '__main__':
TEST_DATA = dict(username='admin', exp=datetime.utcnow() + timedelta(days=1))
token = JwtToken.generate_token(TEST_DATA)
print(token)
payload = JwtToken.parse_token(token)
print(payload)