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.