#api #authentication #pagination #coinbase-api
#API #аутентификация #разбивка на страницы #coinbase-api
Вопрос:
Я тестирую конечные точки Coinbase API с помощью Postman, и проблема заключается в том, когда мне нужно разбить на страницы
Чтобы настроить Postman, я следовал инструкциям, доступным здесь и далее:
- добавлены переменные
- coinbase-api-base
- coinbase-api-key
- coinbase-api-secret
- coinbase-api-timestamp
- coinbase-api-signature
- Добавлен сценарий предварительного запроса для генерации подписи запроса
// 1. Import crypto-js library var CryptoJS = require("crypto-js"); // 2. Create the JSON request object var req = { timestamp: Math.floor(Date.now() / 1000), // seconds since Unix epoch method: pm.request.method, path: pm.request.url.getPath(), body: '', // empty for GET requests message: undefined, secret: pm.collectionVariables.get("coinbase-api-secret"), // read value from collection variable hmac: undefined, signature: undefined, }; // 3. Create the message to be signed req.message = req.timestamp req.method req.path req.body; // 4. Create HMAC using message and API secret req.hmac = CryptoJS.HmacSHA256(req.message, req.secret); // 5. Obtain signature by converting HMAC to hexadecimal String req.signature = req.hmac.toString(CryptoJS.enc.Hex); // 6. Log the request console.info("request: ", req); // 7. Set Postman request's authentication headers for Coinbase REST API call pm.collectionVariables.set("coinbase-api-timestamp", req.timestamp); pm.collectionVariables.set("coinbase-api-signature", req.signature);
все хорошо работало для простого запроса, такого как:
ПОЛУЧИТЬ {{coinbase-api-base}}/v2/accounts
затем, если я добавлю в основной параметр запроса (как описано здесь):
предел = 50
чтобы изменить разбивку на страницы по умолчанию, я получаю сообщение об ошибке аутентификации….
«ошибки»: [ { «id»: «authentication_error»,
«message»: «недопустимая подпись»
}
вопросы:
как я могу это исправить?
как тело запроса может работать с подписью запроса…
любое предложение о помощи приветствуется
Спасибо
Ответ №1:
Редактировать: как говорится ниже, я не уверен, что API базовых учетных записей поддерживает подкачку, хотя я могу ошибаться, документы CB, по меньшей мере, противоречивы. Похоже, что история учетных записей (бухгалтерская книга) и удержания все же сохраняются.
https://docs.cloud.coinbase.com/exchange/reference/exchangerestapi_getaccounts
получить функцию учетных записей в Node.js API не предоставляет параметр args там, где это делает регистр (см. Ниже).:
getAccounts(callback) {
return this.get(['accounts'], callback);
}
Документация для API, который поддерживает подкачку, обратите внимание, что он предоставляет вам раздел параметров запроса, недоступный в документации по учетным записям:
https://docs.cloud.coinbase.com/exchange/reference/exchangerestapi_getaccountledger
Глядя на api узла, вам все равно нужно добавить параметры строки запроса в тело, чтобы подписать:
вызывающая функция:
return this.get(
['accounts', accountID, 'ledger'],
{ qs: args },
callback
);
функция подписи:
let body = '';
if (options.body) {
body = JSON.stringify(options.body);
} else if (options.qs amp;amp; Object.keys(options.qs).length !== 0) {
body = '?' querystring.stringify(options.qs);
}
const what = timestamp method.toUpperCase() path body;
const key = Buffer.from(auth.secret, 'base64');
const hmac = crypto.createHmac('sha256', key);
const signature = hmac.update(what).digest('base64');
return {
key: auth.key,
signature: signature,
timestamp: timestamp,
passphrase: auth.passphrase,
};
Ответ №2:
Вы не можете добавить ограничение к телу запроса, запросы GET никогда не включают в себя какое-либо тело.
Вы должны добавить его в качестве параметра строки запроса, например (это всего лишь пример):
GET {{coinbase-api-base}}/v2/accounts?limit=50
Комментарии:
1. Спасибо. Я, вероятно, спросил это неправильно 😉 Я не вставил тело запроса… Я добавил ограничение в URL, и вдруг кажется, что моя подпись, сгенерированная с помощью сценария предварительного запроса, недействительна… но без параметров в URL он работает нормально…