TokenObject.py 8.5 KB

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