Аутентификация ключа API для coinbase

Пытаюсь написать запрос на API coinbase.com, но не могу правильно сгенерировать подпись. Уже 2 дня пытаюсь найти свою ошибку, но не могу. Я проанализировал код для других языков на странице: https://developers.coinbase.com/docs/wallet/api-key-autumnicathion, но я не вижу различий в реализации.

Помоги мне, пожалуйста.

<?php
$g_coinbase_key = 'KcxisxqmWRVgtwsj';
$g_coinbase_secret = 'isOLGBLaEkCy3ROQMvmjonGmXK0KRmUS';

$time = time();
$method = "GET";
$path = '/v2/accounts/';
$sign = base64_encode(hash_hmac("sha256", $time.$method.$path, $g_coinbase_secret));
$ch = curl_init('https://api.coinbase.com'.$path);
$headers = array(
    "CB-VERSION: 2017-10-26",
    "CB-ACCESS-SIGN: ".$sign,
    "CB-ACCESS-TIMESTAMP: ".$time,
    "CB-ACCESS-KEY: ".$g_coinbase_key,
    "Content-Type: application/json"
);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
var_dump($result);
?>

Результат:

{"errors":[{"id":"authentication_error","message":"invalid signature"}]}

person Maksim Zarubin    schedule 26.10.2017    source источник


Ответы (3)


Создайте подпись следующим образом:

$time = time();
$method = "GET";
$path = 'accounts';
$sign = base64_encode(hash_hmac("sha256", $time.$method.$path, base64_decode($g_coinbase_secret), true));

и заменить

$ch = curl_init('https://api.coinbase.com'.$path);

с

$ch = curl_init('https://api.coinbase.com/v2/');
person Amit-Inex Patel    schedule 29.12.2017
comment
Когда-нибудь это работало? Я пытаюсь сделать что-то подобное в iOS и Swift и не могу заставить работать подпись. И как это может быть правильно: $ch = curl_init('api.coinbase.com/v2/'); ?? - person jimijon; 03.10.2018

Заменять

$sign = base64_encode(hash_hmac("sha256", $time.$method.$path, $g_coinbase_secret));

с

$sign = hash_hmac("sha256", $time.$method.$path, $g_coinbase_secret);

Coibase API использует hash_mac

person user13655505    schedule 01.06.2020

Для правильного создания подписи Coinbase Pro может использовать следующий код, указанный в их документации по API:

class CoinbaseExchange {
    public function __construct($key, $secret, $passphrase) {
        $this->key = $key;
        $this->secret = $secret;
        $this->passphrase = $passphrase;
    }

    public function signature($request_path='', $body='', $timestamp=false, $method='GET') {
        $body = is_array($body) ? json_encode($body) : $body;
        $timestamp = $timestamp ? $timestamp : time();

        $what = $timestamp.$method.$request_path.$body;

        return base64_encode(hash_hmac("sha256", $what, base64_decode($this->secret), true));
    }
}
person E.Bradford    schedule 09.03.2021