TokenObject.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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.eyJ1c2VySUQiOiIxNTQzOTA5MDUwNDEzMTM4MDAxMzgwMDAiLCJsYW5nIjoiZW4iLCJ1c2VyIjoiMTM4MDAxMzgwMDEiLCJleHAiOjE1NTUzODEyMjd9.Wb3pjrJgnM80uJB7m2SOmTl-w7hrYrB4Es5hYpRSxc4'
  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']+'_tokenValues')
  39. if resetCode is False :
  40. # 空
  41. print('token是已经过期了')
  42. user_qs = Device_User.objects.filter(userID=res['userID'], is_active=True, user_isValid=True).values(
  43. "machine_code", )
  44. order_list = list(user_qs)
  45. print ('继续是当前唯一编码')
  46. print (resetCode)
  47. print (self.token)
  48. for ev in order_list:
  49. if resetCode != self.token:
  50. print (res['machine_code'])
  51. print (ev['machine_code'])
  52. if res['machine_code'] != ev['machine_code'] :
  53. print ('发现不同唯一码那么就309')
  54. self.code = 309
  55. return
  56. else:
  57. if not reds.set_data(key=res['userID'] + '_tokenValues', val=self.token,
  58. expire=300): # 1个小时
  59. return response.json(10, '生成缓存错误')
  60. print ('相同的用户token值过期了,而且那个唯一码又没有过期的,然后续期')
  61. else:
  62. print ('相同的用户token值并续期了')
  63. if ev['machine_code'] =='':
  64. if not reds.set_data(key=res['userID'] + '_tokenValues', val=self.token,
  65. expire=300): # 1个小时
  66. return response.json(10, '生成缓存错误')
  67. print ('旧的方式访问,过期后,再续期')
  68. elif (resetCode!=self.token) :
  69. user_qs = Device_User.objects.filter(userID=res['userID'], is_active=True, user_isValid=True).values(
  70. "machine_code", )
  71. order_list = list(user_qs)
  72. for ev in order_list:
  73. if ev['machine_code'] == '':
  74. if not reds.set_data(key=res['userID'] + '_tokenValues', val=self.token,
  75. expire=300): # 1个小时
  76. return response.json(10, '生成缓存错误')
  77. print ('旧的方式登录访问还没有过期只是token值不同了,然后续期')
  78. else :
  79. print ('相同用户id不同token值')
  80. self.code = 309
  81. return
  82. else :
  83. print ('相同的用户token值')
  84. self.userID = res.get('userID', None)
  85. self.lang = res.get('lang', None)
  86. self.user = res.get('user', '')
  87. # 刷新登录时间
  88. if self.userID:
  89. redisObj = RedisObject(db=3)
  90. redisObj.set_data(key=self.userID, val=self.user, expire=300)
  91. except jwt.ExpiredSignatureError as e:
  92. print('过期')
  93. print(repr(e))
  94. self.code = 309
  95. return
  96. except Exception as e:
  97. self.code = 309
  98. return
  99. else:
  100. if not self.userID:
  101. self.code = 309
  102. return
  103. else:
  104. self.code = 0
  105. return res
  106. def generate(self, data={}):
  107. try:
  108. access_expire = int(OAUTH_ACCESS_TOKEN_TIME.total_seconds())
  109. refresh_expire = int(OAUTH_REFRESH_TOKEN_TIME.total_seconds())
  110. now_stamp = int(time.time())
  111. access_data = data
  112. refresh_data = data
  113. access_data['exp'] = access_expire + now_stamp
  114. refresh_data['exp'] = refresh_expire + now_stamp
  115. access_token = jwt.encode(access_data,
  116. OAUTH_ACCESS_TOKEN_SECRET,
  117. algorithm='HS256')
  118. refresh_token = jwt.encode(
  119. refresh_data,
  120. OAUTH_REFRESH_TOKEN_SECRET,
  121. algorithm='HS256')
  122. res = {
  123. 'access_token': access_token.decode('utf-8'),
  124. 'access_expire': access_expire,
  125. 'refresh_expire': refresh_expire,
  126. 'refresh_token': refresh_token.decode('utf-8'),
  127. }
  128. except Exception as e:
  129. self.code = 309
  130. print(repr(e))
  131. else:
  132. self.code = 0
  133. return res
  134. def refresh(self):
  135. if not self.token:
  136. self.code = 309
  137. return
  138. try:
  139. res = jwt.decode(self.token, OAUTH_REFRESH_TOKEN_SECRET, algorithms='HS256')
  140. except jwt.ExpiredSignatureError as e:
  141. print('过期')
  142. print(repr(e))
  143. self.code = 309
  144. except Exception as e:
  145. self.code = 309
  146. print(repr(e))
  147. else:
  148. self.code = 0
  149. userID = res.get('userID', '')
  150. user = res.get('user', '')
  151. lang = self.lang
  152. refreshRes = self.generate(data={'userID': userID, 'lang':lang , 'user': user})
  153. return refreshRes