auth.py 2.4 KB

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