Подписание запросов по API
Общие требования к запросам:
- Выполняются по протоколу HTTPS.
 - Должны содержать параметр 
apikey. Подробнее см. Ключ API. - Должны быть подписаны — подпись добавляется в заголовок 
X-YaCourier-Signature. - В заголовках 
headersдолжен быть переданuser_agent, использованный при формировании подписи. 
Алгоритм вычисления подписи
Для вычисления подписи используется секрет из 32 символов (нужно получить через клиентского менеджера или службу поддержки) и алгоритм SHA-256. После вычисления подпись переводится в HEX-представление.
Важно
Секрет не является подписью, а используется для ее вычисления.
В формировании подписи участвуют:
- User agent;
 - метод запроса — POST, GET;
 - Request-URI — начинается с 
/, хост не указывается; - тело сообщения.
 
Общее описание алгоритма:
items_to_sign = { user_agent, method, " ", uri, body }
signature = HMAC(<secret>)
for item in items_to_sign:
    signature = HMAC(signature, item)
headers['X-YaCourier-Signature'] = hex_encode(signature)
        
    Пример для секрета cb6628c7407fd3c570bebbd7c36731f1 (случайно сгенерированный):
python2
python3
php
import hashlib
import hmac
KEY = "cb6628c7407fd3c570bebbd7c36731f1"
USER_AGENT = "TestUserAgent"
URI = "/test/uri"
BODY = "TestBody"
def gen_signature(key, parts):
    HMAC = hmac.new(key.decode('hex'), None, digestmod=hashlib.sha256)
    for part in parts:
        HMAC.update(part)
    return HMAC.hexdigest()
print gen_signature(KEY, [USER_AGENT, "POST", " ", URI, BODY])
        
    import hashlib
import hmac
KEY = "cb6628c7407fd3c570bebbd7c36731f1"
USER_AGENT = "TestUserAgent"
URI = "/test/uri"
BODY = "TestBody"
def gen_signature(key, parts):
    HMAC = hmac.new(bytes.fromhex(key), None, digestmod=hashlib.sha256)
    for part in parts:
        HMAC.update(part.encode('utf-8'))
    return HMAC.hexdigest()
print(gen_signature(KEY, [USER_AGENT, "POST", " ", URI, BODY]))
        
    $KEY = 'cb6628c7407fd3c570bebbd7c36731f1';
$USER_AGENT = 'TestUserAgent';
$URI = '/test/uri';
$BODY = 'TestBody';
function genSignature($secret, array $parts): string {
    $ctx = hash_init('sha256', HASH_HMAC, hex2bin($secret));
    foreach ($parts as $part) {
	    hash_update($ctx, $part);
    }
    return hash_final($ctx);
}
echo genSignature($KEY, array($USER_AGENT, 'POST', ' ', $URI, $BODY));
        
    Результат:
47abf7284eab22da90f591ff981bc0c4630a8e3a38c9e1cf8d881eb952c22333
Была ли статья полезна?
Предыдущая
Следующая