React Native中的Coinbase API密钥身份验证

时间:2019-04-07 17:24:36

标签: coinbase-api

我能够连接到Coinbase公共API,而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);
    });
});

我在Coinbase上创建了一个只读API密钥,其权限为:wallet:orders:read

我使用CryptoJS代替了crypto,但这不是问题,因为它可以与Bittrex等其他交易所一起使用。我将带符号的密码转换为Base64,但我认为问题可能出在那条线上。

Console Log

在上面的示例中,我没有使用有效的密钥,机密或密码短语,但使用了实际的密钥却无效。

有人可以看到问题吗?

1 个答案:

答案 0 :(得分:0)

我一直在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
}

预哈希(“ what”)如下所示: 1554714678.037POST / orders {“ price”:“ 1.0”,“ size”:“ 1.0”,“ side”:“ buy”,“ product_id”:“ BTC-USD”}

关于Coinbase的注释说密钥需要对base64进行解码,但是他们在示例中使用了秘密。它还说,在将有效负载添加到标头之前,需要对其进行base64编码。我认为我已正确完成所有操作,但仍收到错误消息:

错误:请求失败,状态码为401

当我在Coinbase上创建API密钥时,我拥有正确的权限。它提供了生成后的密钥和秘密。没有提到过阶段。我在文档及其代码示例中看到了它们提供的通行证,但这是做什么用的,应该在Coinbase中定义它。也许是问题所在。

我已将其添加到codesandbox.io,因此更容易了解我在说什么... https://codesandbox.io/s/0q93n9vz20