def wrap_default_rc_tag(origin_dict): """ 直接使用motor的时候,对dict外包一层默认tag :return: """ now_time = get_current_utc_time() origin_dict.update(rc_time=now_time) origin_dict.update(is_del=False) origin_dict.update(del_time=now_time) return origin_dict
async def create_app_session(self, app_id, **kwargs): """ 设置app的登录会话 :return: """ client_type = kwargs.get('client_type', ClientTypeDict.api) ip = self.request.remote_ip db = self.get_async_mongo() app_col = db.test_data_app session_col = db.ttl_app_session test_app = await app_col.find_one({'app_id': app_id}) app_session = await session_col.find_one({'app_id': app_id}) if app_session is not None: # 如果已经存在,则只需要更新时间 current_time = get_current_utc_time() await session_col.update({'app_id': app_id}, {'$set': { 'last_use_time': current_time }}) # app_session.last_use_time = get_current_utc_time() # 更新在线时间 # app_session = await app_session.save() app_session['last_use_time'] = current_time return app_session # 如果不存在登录状态记录,则重新创建session new_session = dict(app_id=app_id, c_type=client_type.value, c_name=client_type.key, organization=test_app['organization'], o_name=test_app['o_name'], ip=ip, token=randtool.generate_uuid_token(), last_use_time=get_current_utc_time()) new_session.update(self.set_http_tag()) new_session = set_default_rc_tag(new_session) await session_col.insert(new_session) self.cache_session = new_session return new_session
async def create_anonymous_token(self, cls, **kwargs): """ 创建匿名token,主要用途: 1. PC上生成二维码,给手机上扫码认证 :param cls: :param kwargs: :return: """ appid = kwargs.get('appid', None) client_type = kwargs.get('client_type', None) # 默认的是浏览器端 if list_have_none_mem(*[client_type]): return None ip = self.request.remote_ip # referer='' if self.request.headers is None user_agent = self.request.headers['User-Agent'] finger_prt = hashlib.md5(user_agent.encode("utf-8")).hexdigest() # 如果是手机认证PC,则直接创建匿名token my_token = cls( c_type=client_type.value, c_name=client_type.key, appid=appid, ) """:type:BaseToken""" # todo 后续如果把应用的系统做好了,这个地方要做一次数据库IO查询处理的,判断是否存在,防止别人撞库 # 允许有匿名用户的存在,这个时候就表明没有被签名的匿名登录 my_token.set_default_rc_tag() my_token.status = QrAuthStatusCode.timeout my_token.set_uuid_rand_token() my_token.set_uuid_rand_token() # 单点登录,将旧的token给弃用掉 my_token.last_use_time = get_current_utc_time() my_token.ip = ip my_token.user_agent = user_agent my_token.finger_prt = finger_prt my_token = await my_token.save() """:type:UserToken""" return my_token
async def create_token_session(self, user, **kwargs): """ 区别:加入了 平台的描述 创建 或者 刷新 token, 包括各种 ttl_token 现在是进行了扩展了,所以用这种方式, - 允许有匿名的存在 :type self:MyBaseHandler :type cls:UserToken :type user:User :param client_type: 客户端类型 :return: :rtype:UserToken """ client_type = kwargs.get('client_type', None) # 默认的是浏览器端 """:type:ValueDict""" # cls = kwargs.get('token_cls', None) # """:type:UserToken""" if list_have_none_mem(*[client_type]): return None # 读取 mongodb,获取用户对应的 token,单点登录情况下使用 # my_token = await cls.objects.get(user=user, c_type=client_type.value) """:type:WebToken""" ip = self.request.remote_ip user_agent = self.request.headers['User-Agent'] finger_prt = hashlib.md5(user_agent.encode("utf-8")).hexdigest() # # if my_token is None: # 单点登录情况下使用 # my_token = cls( # c_type=client_type.value, # c_name=client_type.key, # ) # """:type:UserToken""" db = self.get_async_mongo() token_col = db['ttl_access_token'] user_col = db['g_users'] user_res = await user_col.find_one({'_id': user}) if not user_res: return None new_token = dict( user=user_res['_id'], # todo: save user_id u_name=user_res['nickname']) # if user is not None: # my_token.user = user.get_id() # my_token.u_name = user.nickname # 允许有匿名用户的存在,这个时候就表明没有被签名的匿名登录 new_token = set_default_rc_tag(new_token) new_token['token'] = randtool.generate_uuid_token() new_token['last_use_time'] = get_current_utc_time() new_token['ip'] = ip new_token['user_agent'] = user_agent new_token['finger_prt'] = finger_prt # my_token = await my_token.save() # 通过save获取的my_token并没有lazy出来,后面赋值的时候会有影响 # """:type:UserToken""" # # my_token = await cls.objects.get(id=my_token.get_id()) # 相当于使用了 loadReference功能 await token_col.insert(new_token) return new_token