TokenObject.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. import logging
  2. import jwt
  3. import time
  4. import requests
  5. import datetime
  6. from Object.RedisObject import RedisObject
  7. from Ansjer.config import OAUTH_ACCESS_TOKEN_SECRET, OAUTH_REFRESH_TOKEN_SECRET, OAUTH_ACCESS_TOKEN_TIME, \
  8. OAUTH_REFRESH_TOKEN_TIME, DETECT_PUSH_DOMAINS, LOGGER
  9. from Model.models import StsFrequency
  10. logger = logging.getLogger('token')
  11. class TokenObject:
  12. def __init__(self, token=None, returntpye='currency'):
  13. if token == 'local':
  14. token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySUQiOiIxNTg0MzUxODk2MjgyMTM4MDAxMzgwMDAiLCJsYW5nIjoiZW4iLCJ1c2VyIjoiMTM2ODAzMTc1OTYiLCJtX2NvZGUiOiIxMjM0MTMyNDMyMTQiLCJleHAiOjE1ODcyNzcwNjB9.c0LV_XyxwbzUlYqMJqx7vw9f19Jv-0kGnUHuu_go-mo'
  15. if token == 'test':
  16. token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiMTM4MDAxMzgwMDEiLCJleHAiOjE1Njk5OTg4OTYsInVzZXJJRCI6IjE1MTU2NDI2MjMzNzkzOTUxMzgwMDEzODAwMSIsImxhbmciOiJlbiIsIm1fY29kZSI6IjEyMzQxMzI0MzIxNCJ9.VAQtT9AbCCfXcrNj9DL5cvVasMDoI7AP8ptgU1GoMu8'
  17. today = datetime.datetime.today()
  18. today_date = datetime.datetime(today.year, today.month, today.day)
  19. self.today_timestamp = int(today_date.timestamp())
  20. self.token = token
  21. self.lang = None
  22. self.userID = None
  23. self.user = ''
  24. self.code = 0
  25. self.valid()
  26. self.returntpye = returntpye
  27. def valid(self):
  28. if self.token is None:
  29. logger.info("token is None")
  30. self.code = 309
  31. return
  32. try:
  33. self.token = self.token.replace("Bearer ", "")
  34. res = jwt.decode(self.token, OAUTH_ACCESS_TOKEN_SECRET, algorithms='HS256')
  35. self.userID = res.get('userID', None)
  36. self.lang = res.get('lang', None)
  37. self.user = res.get('user', '')
  38. app_bundle_id = res.get('appBundleId', None)
  39. token_version = res.get('tokenVersion', None)
  40. # 刷新登录时间
  41. # if self.userID:
  42. # print(self.user)
  43. # redisObj = RedisObject(db=3)
  44. # redisObj.set_data(key=self.userID, val=self.user, expire=300)
  45. except jwt.ExpiredSignatureError as e:
  46. self.code = 309
  47. self.add_or_update_qs()
  48. logger.info('errLine:{}, errMsg:{}, token:{}'.format(e.__traceback__.tb_lineno, repr(e), self.token))
  49. return
  50. except Exception as e:
  51. self.code = 309
  52. self.add_or_update_qs()
  53. logger.info('errLine:{}, errMsg:{}, token:{}'.format(e.__traceback__.tb_lineno, repr(e), self.token))
  54. return
  55. else:
  56. if not self.userID:
  57. self.code = 309
  58. self.add_or_update_qs()
  59. logger.info('errMsg:{}, token:{}'.format('缺少用户ID', self.token))
  60. return
  61. else:
  62. if self.userID:
  63. if app_bundle_id and token_version == 'V2':
  64. redis_obj = RedisObject()
  65. key = 'token_user_{}_{}'.format(self.userID, app_bundle_id)
  66. redis_token = redis_obj.get_data(key)
  67. if not redis_token:
  68. redis_obj.set_data(key, self.token)
  69. self.code = 0
  70. return res
  71. if self.token != redis_token:
  72. self.code = 310
  73. logger.info(
  74. 'errMsg:{}, token:{}, redis_token:{}'.format('多点登录', self.token, redis_token))
  75. return
  76. self.code = 0
  77. return res
  78. else:
  79. self.code = 309
  80. return
  81. def generate(self, data=None):
  82. if data is None:
  83. data = {}
  84. try:
  85. access_expire = int(OAUTH_ACCESS_TOKEN_TIME.total_seconds())
  86. refresh_expire = int(OAUTH_REFRESH_TOKEN_TIME.total_seconds())
  87. now_stamp = int(time.time())
  88. access_data = data
  89. refresh_data = data
  90. access_data['exp'] = access_expire + now_stamp
  91. refresh_data['exp'] = refresh_expire + now_stamp
  92. access_token = jwt.encode(access_data,
  93. OAUTH_ACCESS_TOKEN_SECRET,
  94. algorithm='HS256')
  95. refresh_token = jwt.encode(
  96. refresh_data,
  97. OAUTH_REFRESH_TOKEN_SECRET,
  98. algorithm='HS256')
  99. res = {
  100. 'access_token': access_token,
  101. 'access_expire': access_expire,
  102. 'refresh_expire': refresh_expire,
  103. 'refresh_token': refresh_token,
  104. }
  105. if self.returntpye == 'pc':
  106. res = {
  107. 'token': access_token,
  108. 'access_expire': access_expire,
  109. 'refresh_expire': refresh_expire,
  110. 'refresh_token': refresh_token,
  111. }
  112. app_bundle_id = data.get('appBundleId', None)
  113. token_version = data.get('tokenVersion', None)
  114. LOGGER.info('{}生成新token,参数:{}'.format(data.get('userID', 'pctest'), data))
  115. if app_bundle_id and token_version == 'V2':
  116. redis_obj = RedisObject()
  117. key = 'token_user_{}_{}'.format(data['userID'], app_bundle_id)
  118. LOGGER.info('{}写入新token:{}'.format(data['userID'], access_token))
  119. redis_obj.set_data(key, access_token)
  120. if data['tokenVal']:
  121. # 请求推送
  122. push_url = '{}transparent-transmission/logout-push'.format(DETECT_PUSH_DOMAINS)
  123. result = requests.post(push_url, data={'push_token': data['tokenVal'], 'user_id': data['userID'],
  124. 'app_bundle_id': app_bundle_id})
  125. LOGGER.info('{}登出推送结果:{}'.format(data['userID'], result.json()))
  126. logger.info(
  127. '用户登录信息, data:{}, access_token:{}, refresh_token:{}'.format(data, access_token, refresh_token))
  128. except Exception as e:
  129. self.code = 309
  130. self.add_or_update_qs()
  131. logger.info('errLine:{}, errMsg:{}, token:{}'.format(e.__traceback__.tb_lineno, repr(e), self.token))
  132. print(repr(e))
  133. else:
  134. self.code = 0
  135. return res
  136. def encryption(self, data=None):
  137. if data is None:
  138. data = {}
  139. try:
  140. access_expire = int(OAUTH_ACCESS_TOKEN_TIME.total_seconds())
  141. refresh_expire = int(OAUTH_REFRESH_TOKEN_TIME.total_seconds())
  142. now_stamp = int(time.time())
  143. access_data = data
  144. refresh_data = data
  145. access_data['exp'] = access_expire + now_stamp
  146. refresh_data['exp'] = refresh_expire + now_stamp
  147. access_token = jwt.encode(access_data,
  148. OAUTH_ACCESS_TOKEN_SECRET,
  149. algorithm='HS256')
  150. return access_token
  151. except Exception as e:
  152. self.code = 309
  153. print(repr(e))
  154. def refresh(self):
  155. if not self.token:
  156. self.code = 309
  157. return
  158. try:
  159. res = jwt.decode(self.token, OAUTH_REFRESH_TOKEN_SECRET, algorithms='HS256')
  160. except jwt.ExpiredSignatureError as e:
  161. print('过期')
  162. print(repr(e))
  163. self.code = 309
  164. self.add_or_update_qs()
  165. logger.info('errLine:{}, errMsg:{}, token:{}'.format(e.__traceback__.tb_lineno, repr(e), self.token))
  166. except Exception as e:
  167. self.code = 309
  168. self.add_or_update_qs()
  169. logger.info('errLine:{}, errMsg:{}, token:{}'.format(e.__traceback__.tb_lineno, repr(e), self.token))
  170. print(repr(e))
  171. else:
  172. self.userID = res.get('userID', None)
  173. self.user = res.get('user', '')
  174. self.lang = res.get('lang', None)
  175. refreshRes = self.generate(data=res)
  176. return refreshRes
  177. def add_or_update_qs(self):
  178. qs = StsFrequency.objects.filter(type=2, addTime=self.today_timestamp, uid='token')
  179. if qs.exists():
  180. token_qs = qs[0]
  181. token_qs.frequency += 1
  182. token_qs.updateTime = int(time.time())
  183. token_qs.save()
  184. else:
  185. StsFrequency.objects.create(uid='token', frequency=1, type=2, addTime=self.today_timestamp,
  186. updateTime=int(time.time()))