#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)