API Авторизация

Передача токена в заголовке Authorization это отраслевой стандарт безопасности для авторизации, однако часть клиентов захотела еще большей безопасности, потому была добавлена подпись запросов.

Подпись запросов подразумевает что вы неким образом формируете уникальный отпечаток той информации, которую отправляете нам, и мы можем удостовериться что этот запрос послали именно вы, а не злоумышленник, который каким-то образом смог добраться до вашего апи токена.

Предположим вы вычислили подпись для вашего запроса и речь идет про 1234567890, в этом случае ваш запрос должен будет выглядеть следующим образом:

curl --request POST \
 --url https://admin.vanilapay.com/api/v2/deposit \
 --header 'Authorization: Bearer ****' \
 --header 'Signature: 1234567890' \
 --header 'Content-Type: application/json' \
 --data '{
 "order_id": "test1",
 "method": "wallet",
 "amount": "100.00"
}

Пример формирования подписи на Python:


    @staticmethod
    def __get_msg_from_params(params: dict) -> bytes:
        msg = (
            None if not params else
            urllib.parse.urlencode(params)
        )
        return msg

    @staticmethod
    def __get_msg_from_body(self, body: dict) -> bytes:
        msg = (
            None if not body else
            json.dumps(body)
        )
        return msg

    @staticmethod
    def __get_msg_for_signature(method: str, body: dict, params: dict) -> bytes:
        if method == "post":
            msg = self.__get_msg_from_body(body=body)
        else:
            msg = self.__get_msg_from_params(params=params)
        return msg.encode("utf-8")

    def __sign(self, method: str, resource: str, params: dict = None, body: dict = None):
        base_message = f"/api/v2/{resource}".encode(encode_type)
        msg_form_request_data = self.__get_msg_for_signature(method=method, body=body, params=params)
        message = base_message if not msg else base_message + msg_form_request_data
        signature = hmac.new(
            key=self.secret.encode(encode_type),
            msg=message,
            digestmod=hashlib.sha512,
        ).hexdigest()
        self.headers["Signature"] = signature

Last updated