签名装饰器

def check_sign(handler_func):
    """
    验证签名
    :param func handler_func: 请求处理函数
    """
    @functools.wraps(handler_func)
    @tornado.gen.coroutine
    def wrapper(self, *args, **kwargs):
        """
        wrapper
        """
        # 校验签名
        data = dict(urlparse.parse_qsl(self.request.body))
        sign, client_id = data['sign'], data['client_id']
        res = DBMeta().get_secret(client_id)
        if not res:
            self.send_json(SysCodeDict.ACCESS_DENIED, None, 'Access denied')
            raise tornado.gen.Return(None)

        # 请求计数
        today = datetime.datetime.now().strftime('%Y-%m-%d')
        CacheService().set_incr_cache('%s_%s' % (today, client_id))

        data.pop("sign", None)
        str_data = "&".join(["%s=%s" % (k, v) for k, v in sorted(data.items()) if v != ""])
        secret = res['secret']
        data_to_sign = "%s&%s&%s" % (secret, str_data, secret)
        logging.info(hashlib.md5(data_to_sign).hexdigest())
        if sign != hashlib.md5(data_to_sign).hexdigest():
            self.send_json(SysCodeDict.AUTH, None, 'Signature failure')
            raise tornado.gen.Return(None)

        # 执行函数
        yield handler_func(self, *args, **kwargs)

    return wrapper

 

posted @ 2019-08-10 11:46  G先生  阅读(16)  评论(0编辑  收藏  举报

:guocheng