TokenObject.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
  5. @AUTHOR: ASJRD018
  6. @NAME: AnsjerOA
  7. @software: PyCharm
  8. @DATE: 2018/8/13 15:36
  9. @Version: python3.6
  10. @MODIFY DECORD:ansjer dev
  11. @file: TokenObject.py
  12. @Contact: chanjunkai@163.com
  13. """
  14. from Ansjer.config import OAUTH_ACCESS_TOKEN_SECRET, OAUTH_REFRESH_TOKEN_SECRET, OAUTH_ACCESS_TOKEN_TIME, \
  15. OAUTH_REFRESH_TOKEN_TIME
  16. import jwt, time
  17. from Model.models import Device_User
  18. from Object.RedisObject import RedisObject
  19. class TokenObject:
  20. def __init__(self, token=None):
  21. if token == 'local':
  22. token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySUQiOiIxNTQzOTA5MDUwNDEzMTM4MDAxMzgwMDAiLCJsYW5nIjoiZW4iLCJ1c2VyIjoiMTM4MDAxMzgwMDEiLCJleHAiOjE1NTQ3MTQ2OTJ9.jMVRK8GtkZsTfypykBKOHL7Kyxf3BCs0_FQpmK6fAis'
  23. if token == 'test':
  24. token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiMTM4MDAxMzgwMDEiLCJ1c2VySUQiOiIxNTE1NjQyNjIzMzc5Mzk1MTM4MDAxMzgwMDEiLCJsYW5nIjoiZW4iLCJleHAiOjE1NTI2MTIxOTF9.sO8BtSclN6B-qwqNmYWbICatHYEtyMdoqzZ0hcOSsmg'
  25. self.token = token
  26. self.lang = None
  27. self.userID = None
  28. self.user = ''
  29. self.code = 0
  30. self.valid()
  31. def valid(self):
  32. if self.token is None:
  33. self.code = 309
  34. return
  35. try:
  36. res = jwt.decode(self.token, OAUTH_ACCESS_TOKEN_SECRET, algorithms='HS256')
  37. reds = RedisObject()
  38. resetCode = reds.get_data(key=res['userID']+'machine_code')
  39. if resetCode is False :
  40. # 过期不存在情况
  41. if resetCode != res['machine_code']:
  42. user_qs = Device_User.objects.filter(userID=res['userID'], is_active=True,user_isValid=True).values("machine_code", )
  43. order_list = list(user_qs)
  44. for ev in order_list:
  45. if res['machine_code'] != ev['machine_code'] :
  46. # 与数据库的唯一码不一致
  47. self.code = 309
  48. return
  49. else:
  50. if not reds.set_data(key=res['userID'] + 'machine_code', val=res['machine_code'],
  51. expire=5): # 1个小时
  52. return response.json(10, '生成缓存错误')
  53. else:
  54. if ev['machine_code'] == '':
  55. # 空的情况
  56. if not reds.set_data(key=res['userID'] + 'machine_code', val=res['machine_code'],
  57. expire=5): # 1个小时
  58. return response.json(10, '生成缓存错误')
  59. else :
  60. # 存在情况
  61. print ('相同的machine_code值')
  62. self.userID = res.get('userID', None)
  63. self.lang = res.get('lang', None)
  64. self.user = res.get('user', '')
  65. # 刷新登录时间
  66. if self.userID:
  67. redisObj = RedisObject(db=3)
  68. redisObj.set_data(key=self.userID, val=self.user, expire=300)
  69. except jwt.ExpiredSignatureError as e:
  70. print('过期')
  71. print(repr(e))
  72. self.code = 309
  73. return
  74. except Exception as e:
  75. self.code = 309
  76. return
  77. else:
  78. if not self.userID:
  79. self.code = 309
  80. return
  81. else:
  82. self.code = 0
  83. return res
  84. def generate(self, data={}):
  85. try:
  86. access_expire = int(OAUTH_ACCESS_TOKEN_TIME.total_seconds())
  87. refresh_expire = int(OAUTH_REFRESH_TOKEN_TIME.total_seconds())
  88. now_stamp = int(time.time())
  89. access_data = data
  90. refresh_data = data
  91. access_data['exp'] = access_expire + now_stamp
  92. refresh_data['exp'] = refresh_expire + now_stamp
  93. access_token = jwt.encode(access_data,
  94. OAUTH_ACCESS_TOKEN_SECRET,
  95. algorithm='HS256')
  96. refresh_token = jwt.encode(
  97. refresh_data,
  98. OAUTH_REFRESH_TOKEN_SECRET,
  99. algorithm='HS256')
  100. res = {
  101. 'access_token': access_token.decode('utf-8'),
  102. 'access_expire': access_expire,
  103. 'refresh_expire': refresh_expire,
  104. 'refresh_token': refresh_token.decode('utf-8'),
  105. }
  106. except Exception as e:
  107. self.code = 309
  108. print(repr(e))
  109. else:
  110. self.code = 0
  111. return res
  112. def refresh(self):
  113. if not self.token:
  114. self.code = 309
  115. return
  116. try:
  117. res = jwt.decode(self.token, OAUTH_REFRESH_TOKEN_SECRET, algorithms='HS256')
  118. except jwt.ExpiredSignatureError as e:
  119. print('过期')
  120. print(repr(e))
  121. self.code = 309
  122. except Exception as e:
  123. self.code = 309
  124. print(repr(e))
  125. else:
  126. self.code = 0
  127. userID = res.get('userID', '')
  128. user = res.get('user', '')
  129. lang = self.lang
  130. refreshRes = self.generate(data={'userID': userID, 'lang':lang , 'user': user})
  131. return refreshRes