#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved. @AUTHOR: ASJRD018 @NAME: AnsjerOA @software: PyCharm @DATE: 2018/8/13 15:36 @Version: python3.6 @MODIFY DECORD:ansjer dev @file: TokenObject.py @Contact: chanjunkai@163.com """ from Ansjer.config import OAUTH_ACCESS_TOKEN_SECRET, OAUTH_REFRESH_TOKEN_SECRET, OAUTH_ACCESS_TOKEN_TIME, \ OAUTH_REFRESH_TOKEN_TIME import jwt, time from Model.models import Device_User from Object.RedisObject import RedisObject class TokenObject: def __init__(self, token=None): if token == 'local': token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySUQiOiIxNTQzOTA5MDUwNDEzMTM4MDAxMzgwMDAiLCJsYW5nIjoiZW4iLCJ1c2VyIjoiMTM4MDAxMzgwMDEiLCJleHAiOjE1NTUzODEyMjd9.Wb3pjrJgnM80uJB7m2SOmTl-w7hrYrB4Es5hYpRSxc4' if token == 'test': token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiMTM4MDAxMzgwMDEiLCJ1c2VySUQiOiIxNTE1NjQyNjIzMzc5Mzk1MTM4MDAxMzgwMDEiLCJsYW5nIjoiZW4iLCJleHAiOjE1NTI2MTIxOTF9.sO8BtSclN6B-qwqNmYWbICatHYEtyMdoqzZ0hcOSsmg' self.token = token self.lang = None self.userID = None self.user = '' self.code = 0 self.valid() def valid(self): if self.token is None: self.code = 309 return try: res = jwt.decode(self.token, OAUTH_ACCESS_TOKEN_SECRET, algorithms='HS256') reds = RedisObject() resetCode = reds.get_data(key=res['userID']+'_tokenValues') if resetCode is False : # 空 print('token是已经过期了') user_qs = Device_User.objects.filter(userID=res['userID'], is_active=True, user_isValid=True).values( "machine_code", ) order_list = list(user_qs) print ('继续是当前唯一编码') print (resetCode) print (self.token) for ev in order_list: if resetCode != self.token: print (res['machine_code']) print (ev['machine_code']) if res['machine_code'] != ev['machine_code'] : print ('发现不同唯一码那么就309') self.code = 309 return else: if not reds.set_data(key=res['userID'] + '_tokenValues', val=self.token, expire=300): # 1个小时 return response.json(10, '生成缓存错误') print ('相同的用户token值过期了,而且那个唯一码又没有过期的,然后续期') else: print ('相同的用户token值并续期了') if ev['machine_code'] =='': if not reds.set_data(key=res['userID'] + '_tokenValues', val=self.token, expire=300): # 1个小时 return response.json(10, '生成缓存错误') print ('旧的方式访问,过期后,再续期') elif (resetCode!=self.token) : user_qs = Device_User.objects.filter(userID=res['userID'], is_active=True, user_isValid=True).values( "machine_code", ) order_list = list(user_qs) for ev in order_list: if ev['machine_code'] == '': if not reds.set_data(key=res['userID'] + '_tokenValues', val=self.token, expire=300): # 1个小时 return response.json(10, '生成缓存错误') print ('旧的方式登录访问还没有过期只是token值不同了,然后续期') else : print ('相同用户id不同token值') self.code = 309 return else : print ('相同的用户token值') self.userID = res.get('userID', None) self.lang = res.get('lang', None) self.user = res.get('user', '') # 刷新登录时间 if self.userID: redisObj = RedisObject(db=3) redisObj.set_data(key=self.userID, val=self.user, expire=300) except jwt.ExpiredSignatureError as e: print('过期') print(repr(e)) self.code = 309 return except Exception as e: self.code = 309 return else: if not self.userID: self.code = 309 return else: self.code = 0 return res def generate(self, data={}): try: access_expire = int(OAUTH_ACCESS_TOKEN_TIME.total_seconds()) refresh_expire = int(OAUTH_REFRESH_TOKEN_TIME.total_seconds()) now_stamp = int(time.time()) access_data = data refresh_data = data access_data['exp'] = access_expire + now_stamp refresh_data['exp'] = refresh_expire + now_stamp access_token = jwt.encode(access_data, OAUTH_ACCESS_TOKEN_SECRET, algorithm='HS256') refresh_token = jwt.encode( refresh_data, OAUTH_REFRESH_TOKEN_SECRET, algorithm='HS256') res = { 'access_token': access_token.decode('utf-8'), 'access_expire': access_expire, 'refresh_expire': refresh_expire, 'refresh_token': refresh_token.decode('utf-8'), } except Exception as e: self.code = 309 print(repr(e)) else: self.code = 0 return res def refresh(self): if not self.token: self.code = 309 return try: res = jwt.decode(self.token, OAUTH_REFRESH_TOKEN_SECRET, algorithms='HS256') except jwt.ExpiredSignatureError as e: print('过期') print(repr(e)) self.code = 309 except Exception as e: self.code = 309 print(repr(e)) else: self.code = 0 userID = res.get('userID', '') user = res.get('user', '') lang = self.lang refreshRes = self.generate(data={'userID': userID, 'lang':lang , 'user': user}) return refreshRes