Как исправить заголовки запросов API Coinbase Pro?

#javascript #node.js #coinbase-api

#javascript #node.js #coinbase-api

Вопрос:

Я пытаюсь написать код для выполнения заказов с использованием API Coinbase Pro в соответствии с предоставленной документацией. Однако я получил такую ошибку.

Доступ к XMLHttpRequest по адресу ‘https://api.pro.coinbase.com/orders » из источника «http://localhost:8000 ‘ был заблокирован политикой CORS: поле заголовка запроса cb-access-key не разрешено Access-Control-Allow-Headers в предполетном ответе.

И это код, который я написал.

             var vm = this;

            var coinbasePro = {
                passphrase: 'xxxxxxxxx',
                key: 'xxxxxxxxxxxxxxxxxxxxxxx',
                secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==',
                apiURI: 'https://api.pro.coinbase.com',
            };

            var dataRequest = {
                url: '/orders',
                method: 'POST',
                timestamp: Date.now() / 1000,
            };

            var dataBody = JSON.stringify({
                price: '1.0',
                size: '1.0',
                side: 'buy',
                product_id: 'BTC-USD'
            });

            var what = vm.dataRequest.timestamp   vm.dataRequest.method   vm.dataRequest.url   dataBody;
            var key = Buffer.from(vm.coinbasePro.secret, 'base64');
            var hmac = cryptoJs.createHmac('sha256', key);
            var sign = hmac.update(what).digest('base64');

            vm.$http({
                url: vm.coinbasePro.apiURI vm.dataRequest.url,
                method: vm.dataRequest.method,
                headers: {
                    'Accept': 'application/json',
                    'CB-ACCESS-KEY': vm.coinbasePro.key,
                    'CB-ACCESS-SIGN': sign,
                    'CB-ACCESS-PASSPHRASE': vm.coinbasePro.passphrase,
                    'CB-ACCESS-TIMESTAMP': vm.dataRequest.timestamp,
                },
            }).then((res) => {
                console.log(res);
            }).catch((err) => {

            });
 

Я пробовал разные способы добиться успеха и применил некоторые ссылки, с которыми я столкнулся. Спасибо за помощь.

Комментарии:

1. Поскольку этот API не поддерживает CORS, вполне вероятно, что он не предназначен для прямого доступа со страницы. Вместо этого получите доступ к нему со своего сервера. Ваш сервер может выступать в качестве своего рода прокси для этого API. (Вы не сможете заставить его работать только из браузера.)

Ответ №1:

Их API поддерживает CORS, однако он неправильно настроен и не разрешает заголовки безопасности, которые они требуют от вас использовать! Вы можете обойти это, запустив экспресс-прокси с промежуточным программным обеспечением для перезаписи заголовков:

 import express from 'express'
import { createProxyMiddleware } from 'http-proxy-middleware'

const app = express()

app.use(express.static('client'))

const apiProxy = createProxyMiddleware({
  target: 'https://api.pro.coinbase.com',
  changeOrigin: true,
  onProxyRes: res => {
    res.headers = {
      ...res.headers,
      'access-control-allow-headers':
        'Content-Type, cb-access-key, cb-access-sign, cb-access-timestamp, cb-access-passphrase',
    }
  },
})

app.use('/', apiProxy)

app.listen(3001)