token.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import time
  2. from django.core import signing
  3. import hashlib
  4. HEADER = {'typ': 'JWP', 'alg': 'default'}
  5. KEY = "J&Y"
  6. SALT = "www.jmd-mall.cn"
  7. def encrypt(obj):
  8. """加密:signing 加密 and Base64 编码"""
  9. value = signing.dumps(obj, key=KEY, salt=SALT)
  10. value = signing.b64_encode(value.encode()).decode()
  11. return value
  12. def decrypt(src):
  13. """解密:Base64 解码 and signing 解密"""
  14. src = signing.b64_decode(src.encode()).decode()
  15. raw = signing.loads(src, key=KEY, salt=SALT)
  16. return raw
  17. def create_token(username):
  18. """生成token信息"""
  19. # 1. 加密头信息
  20. header = encrypt(HEADER)
  21. # 2. 构造Payload(有效期14天)
  22. payload = {"username": username, "iat": time.time(),
  23. "exp": time.time() + 1209600.0}
  24. payload = encrypt(payload)
  25. # 3. MD5 生成签名
  26. md5 = hashlib.md5()
  27. md5.update(("%s.%s" % (header, payload)).encode())
  28. signature = md5.hexdigest()
  29. token = "%s.%s.%s" % (header, payload, signature)
  30. return token
  31. def get_payload(token):
  32. """解析 token 获取 payload 数据"""
  33. payload = str(token).split('.')[1]
  34. payload = decrypt(payload)
  35. return payload
  36. def get_username(token):
  37. """解析 token 获取 username"""
  38. payload = get_payload(token)
  39. return payload['username']
  40. def get_exp_time(token):
  41. """解析 token 获取过期时间"""
  42. payload = get_payload(token)
  43. return payload['exp']
  44. def check_token(username, token):
  45. """验证 token:检查 username 和 token 是否一致且未过期"""
  46. return get_username(token) == username and get_exp_time(token) > time.time()