You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
flyapps/fir_ser/common/utils/token.py

95 lines
3.3 KiB

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# project: 3月
# author: liuyu
# date: 2020/3/8
import logging
import random
import string
import time
import uuid
from common.cache.storage import TokenManagerCache, RedisCacheBase
logger = logging.getLogger(__name__)
def make_token(release_id, time_limit=60, key='', force_new=False):
token_cache = TokenManagerCache(key, release_id)
token_key, token = token_cache.get_storage_key_and_cache()
if token and not force_new:
logger.debug(
f"make_token cache exists get token:{token} release_id:{release_id} force_new:{force_new} token_key:{token_key}")
return token
else:
random_str = uuid.uuid1().__str__().split("-")[0:-1]
user_ran_str = uuid.uuid5(uuid.NAMESPACE_DNS, release_id).__str__().split("-")
user_ran_str.extend(random_str)
token = "".join(user_ran_str)
token_cache.set_storage_cache({
"atime": time.time() + time_limit,
"data": release_id
}, time_limit)
RedisCacheBase(token).set_storage_cache({
"atime": time.time() + time_limit,
"data": release_id
}, time_limit)
token_cache.set_storage_cache(token, time_limit - 1)
logger.debug(
f"make_token cache not exists get token:{token} release_id:{release_id} force_new:{force_new} token_key:{token_key}")
return token
def verify_token(token, release_id, success_once=False):
try:
token_cache = RedisCacheBase(token)
token, values = token_cache.get_storage_key_and_cache()
if values and release_id == values.get("data", None):
logger.debug(f"verify_token token:{token} release_id:{release_id} success")
if success_once:
token_cache.del_storage_cache()
return True
except Exception as e:
logger.error(f"verify_token token:{token} release_id:{release_id} failed Exception:{e}")
return False
logger.error(f"verify_token token:{token} release_id:{release_id} failed")
return False
def generate_token_for_medium(medium):
if medium == 'email':
return generate_alphanumeric_token_of_length(32)
elif medium == 'wechat':
return 'WeChat'
else:
return generate_numeric_token_of_length(6)
def generate_numeric_token_of_length(length, random_str=''):
return "".join([random.choice(string.digits + random_str) for _ in range(length)])
def generate_alphanumeric_token_of_length(length):
return "".join(
[random.choice(string.digits + string.ascii_lowercase + string.ascii_uppercase) for _ in range(length)])
def generate_good_token_of_length(length):
ascii_uppercase = 'ABCDEFGHJKLMNPQRSTUVWXYZ'
digits = '23456789'
return "".join([random.choice(digits + ascii_uppercase) for _ in range(length)])
def get_random_download_token(token_length=4, token_number=1024, exist_token=None):
if exist_token is None:
exist_token = []
count = 256
random_list = []
while count > 0:
random_list.append(generate_good_token_of_length(token_length))
count -= 1
exist_token.extend(random_list)
exist_token = list(set(exist_token))
if len(exist_token) >= token_number:
return exist_token
return get_random_download_token(token_length, token_number, exist_token)