TokenObject.py 7.9 KB

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