Esempio n. 1
0
    def process_finished(self, *args, **kwargs):
        """
        结果已经返回,处理访问日志
        :return:
        """
        logger.debug('process_finished')
        analytics = self.handler.analytics
        analytics.status_code = self.handler.get_status()
        now_ts = int(time.time() * 1000)
        analytics.elapsed = now_ts - analytics.timestamp

        client = self.handler.client
        # 如果 client 为空表示未能通过鉴权
        if client is not None:
            analytics.client_name = client.config.get('name')
            analytics.client_id = client.config.get('id')
            endpoint = client.request.get('endpoint', {})
            analytics.endpoint_name = endpoint.get('name')
            analytics.endpoint_id = endpoint.get('id')
            analytics.version = endpoint.get('version')
            analytics.builtin_endpoint = endpoint.get('builtin_endpoint',
                                                      False)
            analytics.forward_url = client.request.get('forward_url')

        # 将统计数据暂时存储在 redis 中
        RedisHelper.add_analytics_log(analytics.get_json())
        logger.debug(analytics.get_json())
Esempio n. 2
0
    def process_finished(self, *args, **kwargs):
        """
        结果已经返回,处理访问日志
        :return:
        """
        logger.debug('process_finished')
        analytics = self.handler.analytics
        analytics.status_code = self.handler.get_status()
        now_ts = int(time.time() * 1000)
        analytics.elapsed = now_ts - analytics.timestamp

        client = self.handler.client
        # 如果 client 为空表示未能通过鉴权
        if client is not None:
            analytics.client_name = client.config.get('name')
            analytics.client_id = client.config.get('id')
            endpoint = client.request.get('endpoint', {})
            analytics.endpoint_name = endpoint.get('name')
            analytics.endpoint_id = endpoint.get('id')
            analytics.version = endpoint.get('version')
            analytics.builtin_endpoint = endpoint.get('builtin_endpoint', False)
            analytics.forward_url = client.request.get('forward_url')

        # 将统计数据暂时存储在 redis 中
        RedisHelper.add_analytics_log(analytics.get_json())
        logger.debug(analytics.get_json())
Esempio n. 3
0
def main():
    # 启动 tornado 之前,先测试 redis 是否能正常工作
    RedisHelper.ping_redis()

    # 重新设置一下日志级别,默认情况下,tornado 是 info
    # py2 下 options.logging 不能是 Unicode
    options.logging = native_str(settings.LOGGING_LEVEL)
    # parse_command_line 的时候将 logging 的根级别设置为 info
    options.parse_command_line()
    app = Application()
    server = httpserver.HTTPServer(app, xheaders=True)
    server.listen(options.port, options.host)
    logger.info('api gateway server is running on %s:%s' % (options.host, options.port))
    ioloop.IOLoop.instance().start()
Esempio n. 4
0
 def post(self, *args, **kwargs):
     refresh_token = self.post_data['refresh_token']
     token_info = RedisHelper.get_refresh_token_info(refresh_token)
     access_token_ex = self.client.config.get('access_token_ex')
     refresh_token_ex = self.client.config.get('refresh_token_ex')
     if token_info:
         RedisHelper.clear_token_info(refresh_token=refresh_token)
         token_info = RedisHelper.set_token_info(
             token_info, access_token_ex, refresh_token_ex)
         if token_info is None:
             self.error(msg='Save Access Token Error')
         else:
             self.success(token_info)
     else:
         self.fail(msg='Invalid or Expired Refresh Token')
Esempio n. 5
0
def main():
    # 启动 tornado 之前,先测试 redis 是否能正常工作
    r = RedisHelper()
    r.ping_redis()

    # 重新设置一下日志级别,默认情况下,tornado 是 info
    # options.logging 不能是 Unicode
    options.logging = binary_type(settings.LOGGING_LEVEL)
    # parse_command_line 的时候将 logging 的根级别设置为 info
    tornado.options.parse_command_line()

    http_server = tornado.httpserver.HTTPServer(app, xheaders=True)
    http_server.listen(options.port, options.host)

    logger.info('api gateway server is running on %s:%s' % (options.host, options.port))
    tornado.ioloop.IOLoop.instance().start()
Esempio n. 6
0
    def process_request(self, *args, **kwargs):
        logger.debug('process_request')
        if 'X-Api-User-Json' in self.handler.request.headers:
            del self.handler.request.headers['X-Api-User-Json']

        endpoint = self.handler.client.request['endpoint']
        require_login = endpoint.get('require_login', False)
        if not require_login:
            return

        access_token = self.handler.get_query_argument('access_token', None)
        token_info = RedisHelper.get_access_token_info(access_token)

        if token_info is not None:
            if token_info['access_key'] != self.handler.client.access_key:
                raise AuthRequestException(
                    'This Access Token is Belongs to Another Client App')

            logger.debug('允许访问')
            try:
                json_str = json.dumps(token_info['user_info'],
                                      ensure_ascii=False)
                # 用户信息使用 json 存储,并编码为 base64
                self.handler.request.headers[
                    'X-Api-User-Json'] = base64.b64encode(
                        json_str.encode('utf8'))
            except Exception, e:
                logger.error('设置 X-Api-User-Json 失败')
                logger.error(e.message)
                logger.error(traceback.format_exc())
Esempio n. 7
0
    def process_request(self, *args, **kwargs):
        logger.debug('process_request')
        if 'X-Api-User-Json' in self.handler.request.headers:
            del self.handler.request.headers['X-Api-User-Json']

        endpoint = self.handler.client.request['endpoint']
        require_login = endpoint.get('require_login', False)
        if not require_login:
            return

        access_token = self.handler.get_query_argument('access_token', None)
        token_info = RedisHelper.get_access_token_info(access_token)

        if token_info is not None:
            if token_info['access_key'] != self.handler.client.access_key:
                raise AuthRequestException('This Access Token is Belongs to Another Client App')

            logger.debug('允许访问')
            try:
                json_str = json.dumps(token_info['user_info'], ensure_ascii=False)
                # 用户信息使用 json 存储,并编码为 base64
                self.handler.request.headers['X-Api-User-Json'] = base64.b64encode(json_str.encode('utf8'))
            except Exception, e:
                logger.error('设置 X-Api-User-Json 失败')
                logger.error(e.message)
                logger.error(traceback.format_exc())
Esempio n. 8
0
 def post(self, *args, **kwargs):
     refresh_token = self.post_data['refresh_token']
     token_info = RedisHelper.get_refresh_token_info(refresh_token)
     access_token_ex = self.client.config.get('access_token_ex')
     refresh_token_ex = self.client.config.get('refresh_token_ex')
     if token_info:
         RedisHelper.clear_token_info(refresh_token=refresh_token)
         token_info = RedisHelper.set_token_info(token_info,
                                                 access_token_ex,
                                                 refresh_token_ex)
         if token_info is None:
             self.error(msg='Save Access Token Error')
         else:
             self.success(token_info)
     else:
         self.fail(msg='Invalid or Expired Refresh Token')
Esempio n. 9
0
    def process_request(self, *args, **kwargs):
        logger.debug('process_request')
        if 'X-Api-User-Json' in self.handler.request.headers:
            del self.handler.request.headers['X-Api-User-Json']

        endpoint = self.handler.client.request['endpoint']
        require_login = endpoint.get('require_login', False)
        if not require_login:
            return

        # 默认从 headers 中获取
        access_token = self.handler.request.headers.get('X-Api-Access-Token', None)
        # 如果没有获取到,再从 url 中获取
        if access_token is None:
            access_token = self.handler.get_query_argument('access_token', None)
        token_info = RedisHelper.get_access_token_info(access_token)

        if token_info is not None:
            if token_info['access_key'] != self.handler.client.access_key:
                raise LoginAuthException('This Access Token Belongs to Another Client App')

            logger.debug('允许访问')
            try:
                json_str = json.dumps(token_info['user_info'], ensure_ascii=False)
                # 用户信息使用 json 存储,并编码为 base64
                self.handler.request.headers['X-Api-User-Json'] = base64.b64encode(json_str.encode('utf8'))
            except Exception as e:
                logger.error('设置 X-Api-User-Json 失败')
                logger.error(e)
                logger.error(traceback.format_exc())
        else:
            logger.info('没有获取到用户信息,不允许访问')
            # 获取用户信息失败
            raise LoginAuthException('Expired or Invalid Access Token')
Esempio n. 10
0
def main():
    # 启动 tornado 之前,先测试 redis 是否能正常工作
    r = RedisHelper()
    r.ping_redis()

    # 重新设置一下日志级别,默认情况下,tornado 是 info
    # options.logging 不能是 Unicode
    options.logging = binary_type(settings.LOGGING_LEVEL)
    # parse_command_line 的时候将 logging 的根级别设置为 info
    tornado.options.parse_command_line()

    http_server = tornado.httpserver.HTTPServer(app, xheaders=True)
    http_server.listen(options.port, options.host)

    logger.info('api gateway server is running on %s:%s' %
                (options.host, options.port))
    tornado.ioloop.IOLoop.instance().start()
Esempio n. 11
0
class UnionFind():
    def __init__(self, conn_type):
        self.redis_obj = RedisHelper(conn_type)

    def get_redis_ttl(self):
        return settings.REDIS_TTL
        # now = datetime.now()
        # midnight = (now + timedelta(days=1)).replace(hour=0, minute=0, second=0, microsecond=0)
        # return (midnight - now).seconds

    def find_parent(self, group_id):
        group_dict = self.redis_obj.get_value(group_id + "_link")
        group_dict = eval(group_dict)
        if group_dict.get('parent') != group_id:
            group_dict['parent'] = self.find_parent(group_dict.get('parent'))
            ttl = self.get_redis_ttl()
            self.redis_obj.set_value(group_id + "_link", group_dict, ttl)
        return group_dict.get('parent')

    def merge(self, g1, g2):
        p1 = self.find_parent(g1)
        p2 = self.find_parent(g2)
        g1_dict = self.redis_obj.get_value(p1 + "_link")
        g2_dict = self.redis_obj.get_value(p2 + "_link")
        g1_dict, g2_dict = eval(g1_dict), eval(g2_dict)
        if g1_dict.get('rank') < g2_dict.get('rank'):
            g1_dict['parent'] = p2
        elif g2_dict.get('rank') < g1_dict.get('rank'):
            g2_dict['parent'] = p1
        else:
            g2_dict['parent'] = p1
            g2_dict['rank'] = g2_dict.get('rank') + 1
        ttl = self.get_redis_ttl()
        self.redis_obj.set_value(g1 + "_link", g1_dict, ttl)
        self.redis_obj.set_value(g2 + "_link", g2_dict, ttl)
Esempio n. 12
0
    def post(self, *args, **kwargs):
        logger.debug('AuthLoginHandler')
        login_auth_url = self.client.config.get('login_auth_url')
        logger.debug(login_auth_url)
        if login_auth_url is None:
            raise AuthRequestException(
                'Missing Login Auth Url in Client Config')
        # access_token 多少秒后过期
        access_token_ex = self.client.config.get('access_token_ex')
        refresh_token_ex = self.client.config.get('refresh_token_ex')

        # 设置超时时间
        async_http_connect_timeout = ASYNC_HTTP_CONNECT_TIMEOUT
        async_http_request_timeout = ASYNC_HTTP_REQUEST_TIMEOUT
        headers = {'Content-Type': 'application/json; charset=utf-8'}
        try:
            response = yield AsyncHTTPClient().fetch(
                HTTPRequest(url=login_auth_url,
                            method=self.request.method,
                            body=self.request.body,
                            headers=headers,
                            connect_timeout=async_http_connect_timeout,
                            request_timeout=async_http_request_timeout))
        except Exception as e:
            logger.error(e)
            logger.error(traceback.format_exc())
            raise AuthRequestException('Fail to Request Login Auth Url')

        json_data = json.loads(response.body)
        if json_data['code'] == APIStatusCode.SUCCESS:
            user_info = json_data['data']
            token_info = {
                'access_key': self.client.access_key,
                'user_info': user_info
            }

            token_info = RedisHelper.set_token_info(token_info,
                                                    access_token_ex,
                                                    refresh_token_ex)
            if token_info is None:
                self.error(msg='Save Access Token Error')
            else:
                data = {
                    'access_token': token_info['access_token'],
                    'refresh_token': token_info['refresh_token'],
                    # access_token 过期时间
                    'expires_in': int(time.time()) + access_token_ex,
                    'user_info': user_info
                }
                self.success(data)
        else:
            self.fail(msg=json_data['msg'])
Esempio n. 13
0
    def __init__(self, threadnum, lock, config, queue, shutdown_event):
        """
        Transporter class initializer
        @param threadnum: Thread number, for debuggable log message. Used to
        create a unique tag
        @param lock: The thread lock object
        @param config: The configuration dictionary
        @param queue: Name of the queue. The `queue` is the queue name in
        RabbitMQ and queue:`queue` for Redis list
        @param shutdown_event: Event object
        """
        threading.Thread.__init__(self)
        self.threadnum = threadnum
        self.lock = lock
        self.config = config
        self.queue = queue
        self.shutdown_event = shutdown_event

        self.redis_queue = "queue:%s" % self.queue
        self.redis = RedisHelper(config["redis_host"], config["redis_port"])
        self.mailer = EmailHelper(config["agent"], config["sender_email"],
                                  config["receiver_email"])

        self.tag = "%s-%s#%s" % (config["agent"], self.queue, self.threadnum)
        self.exchange = config["rabbit_exchange"]
        self.exchange_type = config["rabbit_exchange_type"]
        self.routing_key = "%s.%s" % (self.exchange, self.queue)
        self.publish_interval = float(config["publish_interval"])
        self.message_header = {
            "node": socket.gethostname(),
            "queue": self.queue,
            "tag": self.tag
        }

        self.amqp_url = ("amqp://%s:%s@%s:%s/%s?connection_attempts=3&"
                         "heartbeat_interval=600&socket_timeout=300" %
                         (config["rabbit_user"], config["rabbit_passwd"],
                          config["rabbit_host"], config["rabbit_port"],
                          urllib.quote(config["rabbit_vhost"], "")))

        self.connection = None
        self.channel = None
        self.deliveries = []
        self.acked = 0
        self.nacked = 0
        self.message_number = 0
        self.publishing = False
        self.stopping = False
        self.closing = False
        self.isRouter = config["router"]
Esempio n. 14
0
    def post(self, *args, **kwargs):
        logger.debug('AuthLoginHandler')
        login_auth_url = self.client.config.get('login_auth_url')
        logger.debug(login_auth_url)
        if login_auth_url is None:
            raise AuthRequestException('Missing Login Auth Url in Client Config')
        # access_token 多少秒后过期
        access_token_ex = self.client.config.get('access_token_ex')
        refresh_token_ex = self.client.config.get('refresh_token_ex')

        # 设置超时时间
        async_http_connect_timeout = ASYNC_HTTP_CONNECT_TIMEOUT
        async_http_request_timeout = ASYNC_HTTP_REQUEST_TIMEOUT
        headers = {'Content-Type': 'application/json; charset=utf-8'}
        try:
            response = yield AsyncHTTPClient().fetch(
                HTTPRequest(url=login_auth_url,
                            method=self.request.method,
                            body=self.request.body,
                            headers=headers,
                            connect_timeout=async_http_connect_timeout,
                            request_timeout=async_http_request_timeout))
        except Exception as e:
            logger.error(e)
            logger.error(traceback.format_exc())
            raise AuthRequestException('Fail to Request Login Auth Url')

        json_data = json_decode(response.body)
        if json_data['code'] == APIStatusCode.SUCCESS:
            user_info = json_data['data']
            token_info = {
                'access_key': self.client.access_key,
                'user_info': user_info
            }

            token_info = RedisHelper.set_token_info(
                token_info, access_token_ex, refresh_token_ex)
            if token_info is None:
                self.error(msg='Save Access Token Error')
            else:
                data = {
                    'access_token': token_info['access_token'],
                    'refresh_token': token_info['refresh_token'],
                    # access_token 过期时间
                    'expires_in': int(time.time()) + access_token_ex,
                    'user_info': user_info
                }
                self.success(data)
        else:
            self.fail(msg=json_data['msg'])
Esempio n. 15
0
    def get_client_config(self):
        config_data = RedisHelper.get_client_config(self.access_key)
        if config_data is None:
            raise ClientBadConfigException('No Client Config')
        else:
            # 校验 config 数据是否正确
            v = Validator(self.config_schema, allow_unknown=True)
            if not v.validate(config_data):
                logger.error(v.errors)
                raise ClientBadConfigException('Bad Client Config')

        logger.debug(config_data)
        if not config_data.get('enable', True):
            raise AuthRequestException('Disabled Client')

        self.secret_key = config_data.get('secret_key')
        # 添加内置的 endpoint
        for t in settings.BUILTIN_ENDPOINTS:
            endpoint = t['config']
            k = '%s:%s' % (endpoint['name'], endpoint['version'])
            config_data['endpoints'][k] = endpoint

        self.config = config_data
Esempio n. 16
0
    def get_client_config(self):
        config_data = RedisHelper.get_client_config(self.access_key)
        if config_data is None:
            raise ClientBadConfigException('No Client Config')
        else:
            # 校验 config 数据是否正确
            v = Validator(self.config_schema, allow_unknown=True)
            if not v.validate(config_data):
                logger.error(v.errors)
                raise ClientBadConfigException('Bad Client Config')

        logger.debug(config_data)
        if not config_data.get('enable', True):
            raise AuthRequestException('Disabled Client')

        self.secret_key = config_data.get('secret_key')
        # 添加内置的 endpoint
        for t in settings.BUILTIN_ENDPOINTS:
            endpoint = t['config']
            k = '%s:%s' % (endpoint['name'], endpoint['version'])
            config_data['endpoints'][k] = endpoint

        self.config = config_data
Esempio n. 17
0
 def save_to_redis(self):
     r = RedisHelper.get_client()
     access_log = json.dumps(self.get_json(save_to_redis=True))
     r.rpush(ANALYTICS_LOG_REDIS_LIST_KEY, access_log)
Esempio n. 18
0
 def __init__(self, conn_type):
     self.redis_obj = RedisHelper(conn_type)
Esempio n. 19
0
 def post(self, *args, **kwargs):
     access_token = self.post_data['access_token']
     RedisHelper.clear_token_info(access_token=access_token)
     self.success(msg='Logout Success')
Esempio n. 20
0
 def post(self, *args, **kwargs):
     access_token = self.post_data['access_token']
     RedisHelper.clear_token_info(access_token=access_token)
     self.success(msg='Logout Success')