Аутентификация Coinbase Pro: нет действительной подписи - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь пройти аутентификацию в Coinbase Pro из скрипта Google. Мне уже удалось сделать это в Postman с использованием Crypto JS, но я сталкиваюсь с проблемами , генерирующими заголовок подписи CB-ACCESS-SIGN . Я настроил тест с использованием тестового ключа и секретной строки, чтобы выяснить различия между Crypto JS .HmacSHA256 и Utilities.computeHmacSha256Signature , реализация, которую предлагает Google, и заметил разница в параметрах: Crypto JS .HmacSHA256 ожидает секрет в виде WordArray, а Utilities.computeHmacSha256Signature ожидает секрет в виде строки.

В Postman я делаю следующее, чтобы получить массив слов моего apiSecret для передачи Crypto JS .HmacSHA256:

var hash = CryptoJS.enc.Base64.parse(pm.variables.get('apiSecret'));

В моем скрипте Google я делаю сам

var hash = Utilities.base64Decode(apiSecretB64)

Я пытался отладить это с тем же секретом и сообщением, но я Получаю разные результаты.

Моя реализация в Postman:

function computeSignature(request) {
    const data      = request.data;
    const method    = request.method.toUpperCase();
    const path      = getPath(request.url);
    const body      = (method === 'GET' || !data) ? '' : JSON.stringify(data);
    const message   = timestamp + method + path + body;

    const apiSecret = CryptoJS.enc.Base64.parse(pm.variables.get('apiSecret'));
    const hash      = CryptoJS.HmacSHA256(message, apiSecret);

    const hashInBase64 = CryptoJS.enc.Base64.stringify(hash);

    return hashInBase64;
}

И моя реализация в Google Script:

function computeSignature(request, path, timestamp) {
    const data      = request.data;
    const method    = request.method;
    const body      = (method === 'GET' || !data) ? '' : JSON.stringify(data);
    const message   = timestamp + method + path + body;

    var apiSecret = Utilities.base64Decode(apiSecretB64);

    var hash = Utilities.computeHmacSha256Signature(message, apiSecret);
    hash = Utilities.base64Encode(hash);

    return hash;
}

Кто-нибудь знает, почему я получаю разные результаты?

1 Ответ

0 голосов
/ 16 февраля 2020

Мне удалось решить эту проблему путем преобразования сообщения из строки в байтовый массив:

function computeSignature(request, path, timestamp) {
    const data      = request.data;
    const method    = request.method;
    const body      = (method === 'GET' || !data) ? '' : JSON.stringify(data);
    const message   = timestamp + method + path + body;

    var apiSecretByteArr = Utilities.base64Decode(apiSecretB64);
    var messageByteArr = Utilities.base64Decode(Utilities.base64Encode(message));

    var hash = Utilities.computeHmacSha256Signature(messageByteArr, apiSecretByteArr);

    return Utilities.base64Encode(hash);
}

Возможно, есть лучший способ сделать это, но по крайней мере правильная подпись сейчас вычислен.

...