Проверка подлинности ключа API Coinbase в React Native - PullRequest
1 голос
/ 07 апреля 2019

Я могу без проблем подключиться к общедоступному API Coinbase из React Native. Я пытаюсь заставить работать аутентификацию по ключу API. Я думаю, что мой код выглядит правильно, но я получаю ошибку 401. Я сделал то же самое с Bittrex, и он работал без проблем.

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

const key = 'XXXXXXXXXXXXXXXX'
const secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const passphase = 'PASSPHASE'

const method = 'POST';
const timestamp = Date.now() / 1000;
const requestPath = '/orders';
const body = '';
const prehash = timestamp + method + requestPath + body;
const secretBase64 = Buffer(secret, 'base64');
const signed = CryptoJS.HmacSHA512(prehash, key);
const signedBase64 = new 
Buffer(signed.toString()).toString('base64');

axios
  .put(url, {
    timeout: axiosTimeout,
    headers: {
      'CB-ACCESS-KEY': key,
      'CB-ACCESS-SIGN': signedBase64,
      'CB-ACCESS-TIMESTAMP': timestamp,
      'CB-ACCESS-PASSPHRASE': passphrase
   },
   debug: true
 })
 .then(response => {
    console.log(response);
 })
   .catch(error => {
       console.log(error.message);
    });
});

Я создал ключ API только для чтения на Coinbase с разрешением: кошелек: orders: read

Я использую CryptoJS вместо crypto, но это не проблема, поскольку он работает с другими биржами, такими как Bittrex. Я преобразовал подписанный шифр в Base64, но я думаю, что проблема, вероятно, в этой строке.

Журнал консоли

В приведенном выше примере я не использую действительный ключ, секрет или фразу-пароль, но использую фактический ключ, который не работает.

Кто-нибудь может увидеть проблему?

1 Ответ

0 голосов
/ 08 апреля 2019

Я следовал этому примеру на Coinbase: https://docs.pro.coinbase.com/#api-key-permissions

Я знаю, что есть некоторые различия между "crypto" и "crypto-js".

Я думаю, это должно выглядеть примерно так:

const method = 'POST';
const timestamp = Date.now() / 1000;
const requestPath = url.replace(baseURL, '');
const body = JSON.stringify({
    price: '1.0',
    size: '1.0',
    side: 'buy',
    product_id: 'BTC-USD'
});
const prehash = timestamp + method + requestPath + body;
const keyBase64 = Buffer(secret, 'base64');
const signed = CryptoJS.HmacSHA512(prehash, secret).toString(CryptoJS.enc.Base64);

const headers = {
  'CB-ACCESS-KEY': keyBase64,
  'CB-ACCESS-SIGN': signed,
  'CB-ACCESS-TIMESTAMP': timestamp,
  'CB-ACCESS-PASSPHRASE': passphrase
}

Предварительный хеш ('что') в выглядит примерно так ... 1554714678.037POST / orders {"price": "1.0 "," size ":" 1.0 "," side ":" buy "," product_id ":" BTC-USD "}

В примечании на Coinbase говорится, что ключ должен декодироваться в base64, но они используютсекрет в их примере.В нем также говорится, что полезная нагрузка должна быть закодирована в base64 перед добавлением в заголовок.Я думаю, что все сделал правильно, но все еще получаю сообщение об ошибке:

Ошибка: запрос не выполнен с кодом состояния 401

Когда я создал ключ API на Coinbase, у меня есть правильное разрешение,Это обеспечило ключ и секрет после поколения.Там не было никакого упоминания о фазе.Я вижу в документации и в своем примере кода они предоставляют парольную фазу, но для чего она и где она должна быть определена в Coinbase.Может быть, в этом проблема.

Я добавил это в codesandbox.io, чтобы было легче понять, о чем я говорю ... https://codesandbox.io/s/0q93n9vz20

...