InvalidKey в Kraken API с JS, а не с Python - PullRequest
0 голосов
/ 27 сентября 2018

Мой код для получения моего баланса из 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 Кажется, что запросы идентичны (кроме подписи)и, разумеется, одноразовый номер, который будет и должен меняться с каждым запросом).

enter image description here

1 Ответ

0 голосов
/ 27 сентября 2018

Оказывается, в конце концов, это была подпись, и Кракен просто не дает очень точных ответов (что имеет некоторый смысл, но является болью, если вы пытаетесь что-то выяснить).Наконец я смог переписать код только с помощью 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.

...