TokenObject.py 7.1 KB

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