1、定义的携带字符串,导包:
import time
from django.core import signing
import hashlib
from django.core.cache import cache
from django.conf import settings
settings.configure(DEBUG=True)
HEADER = {'typ': 'JWP', 'alg': 'default'}
KEY = 'CHEN_FENG_YAO'
SALT = 'www.lanou3g.com'
TIME_OUT = 30 * 60 # 30min
2、生成:
def encrypt(obj):
"""加密"""
value = signing.dumps(obj, key=KEY, salt=SALT)
value = signing.b64_encode(value.encode()).decode()
return value
def create_token(username):
"""生成token信息"""
# 1. 加密头信息
header = encrypt(HEADER)
# 2. 构造Payload
payload = {"username": username, "iat": time.time()}
payload = encrypt(payload)
# 3. 生成签名
md5 = hashlib.md5()
md5.update(("%s.%s" % (header, payload)).encode())
signature = md5.hexdigest() # 加密方式
token = "%s.%s.%s" % (header, payload, signature) # 使用'.'链接
# 存储到缓存中redis中
cache.set(username, token, TIME_OUT)
return token
3、解析:
def decrypt(src):
"""解密"""
src = signing.b64_decode(src.encode()).decode()
raw = signing.loads(src, key=KEY, salt=SALT)
return raw
def get_payload(token):
"""获取用户加密的payload, 以'.'切割token, payload位于列表1号位"""
payload = str(token).split('.')[1]
payload = decrypt(payload)
return payload
def get_username(token):
payload = get_payload(token)
return payload['username']
4、验证token:
def check_token(token):
username = get_username(token)
last_token = cache.get(username) # 从redis中获取用户名对应的token
if last_token:
return last_token == token
return False