auth.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # -*- coding: utf-8 -*-
  2. from .__load__ import *
  3. class Auth(object):
  4. def init(self, param={}, request=False):
  5. if 'appid' not in param:
  6. return '参数错误:appid'
  7. if 'timestamp' not in param:
  8. return '参数错误:timestamp'
  9. if 'nonce' not in param:
  10. return '参数错误:nonce'
  11. if 'signature' not in param:
  12. return '参数错误:signature'
  13. model = Demeter.model('site')
  14. model.appid = param['appid']
  15. site = model.select(type='fetchone')
  16. return site
  17. if not site:
  18. return '站点信息不存在'
  19. time = Demeter.time()
  20. if time < site['sdate'] or time > site['edate']:
  21. return '授权已失效'
  22. if time - int(param['timestamp']) > 600:
  23. return '签名已过期'
  24. if request:
  25. # 针对域名做白名单
  26. referer = request.headers.get("Referer")
  27. if not referer:
  28. return '验证失败:来源错误'
  29. host = Demeter.host(site['link'])
  30. if host != Demeter.host(referer):
  31. return '验证失败:来源错误'
  32. uri = self.getHost(request) + request.uri
  33. if referer == uri:
  34. return '验证失败:来源错误'
  35. param['appsecret'] = site['appsecret']
  36. if self.signature(param) != signature:
  37. return '验签失败'
  38. return site
  39. def getHost(self, request):
  40. host = request.host.replace(':8088', '')
  41. host = request.protocol + "://" + host
  42. return host
  43. def signature(self, param):
  44. all_params = {}
  45. for k, v in param.items():
  46. all_params[k] = str(v)
  47. sorted_items = sorted(all_params.items(), key=lambda x: x[0])
  48. param_str = "&".join(f"{k}={v}" for k, v in sorted_items)
  49. return Demeter.md5(param_str)
  50. # sign 只能使用一次 以后再说吧
  51. def check(self, param):
  52. model = Demeter.model('signature')
  53. model.appid = param['appid']
  54. model.signature = param['signature']
  55. info = model.select(type='fetchone')
  56. if info:
  57. return False
  58. model.site_id = param['appid']
  59. model.signature = param['signature']
  60. model.insert()
  61. def clear(self):
  62. num = Demeter.time() - 3600*24
  63. model = Demeter.model('signature')
  64. model.cdate.assign(num, exp='<=')
  65. model.delete()