Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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