Проблемы с аутентификацией в Coinbase с помощью PHP с использованием PHP CURL

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

Учитывая, что info() — это функция (в конечном итоге превратит ее в объект), которая получает API_KEY, API_SECRET, USERAGENT и базовый URL-адрес Coinbase (каждый протестирован), а также функция get_coinbase_time(), которая была протестирована для получения времени эпохи из Coinbase, я не испытываю радости. Я предполагаю, что ошибка находится в строке, где определен $sign. В документах не очень ясно, как решить эту проблему. Может ли кто-нибудь оценить мой код и порекомендовать изменения или предложить код, который может работать, на котором я могу учиться.

Спасибо!

<?php

var_dump(get_coinbase_access('/v2/accounts'));

function get_coinbase_access($path){   
    $data = get_coinbase_time() . 'GET' . $path;
    $sign = hash_hmac("sha256", $data, info('secret'));
    $headers = array();
    $headers[] = 'CB-ACCESS-KEY: ' . info('key');
    $headers[] = 'CB-ACCESS-SIGN: ' . $sign;
    $headers[] = 'CB-ACCESS-TIMESTAMP: ' . get_coinbase_time();
    $headers[] = 'CB-VERSION: 2016-03-08';
    $headers[] = 'Content-Type: application/json';


        $ch= curl_init(info('url') . $path);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
        curl_setopt($ch, CURLOPT_USERAGENT, info('useragent'));
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        $response = curl_exec($ch);
        $res = json_decode($response, TRUE);
        return $res;
}
?>

person Saul Rosenberg    schedule 17.01.2021    source источник


Ответы (2)


Я не эксперт (просто разбираюсь в этом...)

Если вас интересует Coinbase, а не CoinbasePro, то я думаю, что в разделе [документы, которые вам нужны] [1] говорится:

Заголовок CB-ACCESS-SIGN генерируется путем создания sha256 HMAC с использованием секретного ключа в отметке времени строки предварительного хэша + метод + requestPath + тело (где + представляет собой конкатенацию строк). Значение временной метки совпадает с заголовком CB-ACCESS-TIMESTAMP.

Итак, у вас есть вещи в неправильном порядке.

Я думаю, вы могли бы использовать что-то вроде этого:

function signature($request_path='', $body='', $timestamp, $method='GET') {
  $w= $timestamp.$method.$request_path.$body;
  return hash_hmac("sha256", $w, API_SECRET, false);}
person niccol    schedule 16.04.2021

Попробуй это:

  $timestamp = time();
  $body = '';
  $message = $timestamp . 'GET' . $path . $body;
  $sign = hash("sha256", COINBASE_SECRET_KEY . $message);
 
person Leo V    schedule 19.01.2021