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