InvalidKey в Kraken API с JS, а не с Python

Мой код для получения моего баланса из API-интерфейса Kraken работает в Python (на основе библиотеки krakenex), но не в версии JS (основанной на библиотеке kraken-api, но с crypto библиотека заменена на crypto-js). Ошибка всегда: неверный ключ.

Даже когда я копирую заголовки и одноразовые номера, отправленные клиентом Python в Postman, я получаю неверный ключ.

Я полагаю, что подпись и одноразовый номер действительны, потому что, когда это не так, Кракен отвечает, что либо подпись, либо одноразовый номер недействительны.

Есть ли что-нибудь еще, что в Javascript fetch делает иначе, чем Python3 requests? Потому что тело и заголовки в остальном идентичны.

Код JS, который генерирует данные аутентификации:

const getMessageSignature = (path, request, secret, nonce) => {
    // API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key
    const message = qs.stringify(request);
    console.log(message);

    const secret_buffer = btoa(secret);
    const hash = CryptoJS.algo.SHA256.create();
    const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA512, secret_buffer);
    const hash_digest = hash.update(nonce + message).finalize().toString(CryptoJS.enc.Hex);
    const hmac_digest = hmac.update(path + hash_digest).finalize().toString(CryptoJS.enc.Base64);

    // CANNOT USE ORIGINAL LIB CODE (Buffer, got and crypto not supported)
    // const secret_buffer = new Buffer(secret, 'base64');
    // const hash = new crypto.createHash('sha256');
    // const hmac = new crypto.createHmac('sha512', secret_buffer);
    // const hash_digest = hash.update(nonce + message).digest('binary');
    // const hmac_digest = hmac.update(path + hash_digest, 'binary').digest('base64');

    return hmac_digest;
};

Обновление: На самом деле, следующие наблюдения странны:

  • правильный ключ + правильная подпись = "неправильный ключ"
  • неверный ключ + правильная подпись = "неверный ключ"
  • неверный ключ + неверная подпись = "неверный ключ"
  • правильный ключ + неверная подпись = "неверная подпись"

что дает?

Update2 Кажется, что запросы идентичны (кроме подписи и одноразового номера, конечно, которые будут и должны меняться с каждым запросом).

1 ответ

Решение

Оказывается, это была подпись в конце концов, и Кракен просто не дает очень точных ответов (что имеет некоторый смысл, но является болью, если вы пытаетесь что-то выяснить). Наконец я смог переписать код, используя только CryptoJS:

const getMessageSignature = (path, request, secret, nonce) => {
    // API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key
    const message = JSON.stringify(request);
    const hash = CryptoJS.SHA256(nonce + message);
    const secret_buffer = CryptoJS.enc.Base64.parse(secret);
    const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA512, secret_buffer);
    hmac.update(path, secret_buffer);
    hmac.update(hash, secret_buffer);
    return hmac.finalize().toString(CryptoJS.enc.Base64);
};

Это дает правильную подпись, и Кракен больше не жалуется. Zzah.

Другие вопросы по тегам