Как сделать правильный заголовок аутентификации hmac - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь использовать combell api для автоматизации моего хостинга.Мне нужно сгенерировать заголовок аутентификации HMAC для API-запроса.Я использую Guzzle.

Мой текущий код с моим заголовком генерирует эту ошибку:

Ошибка клиента: GET https://api.combell.com/v2/accounts привела к ответу 401 Unauthorized: {«error_code»: «authorization_hmac_invalid», «error_text»: «hmac недействителен».}

Мой контроллер

class GuzzleController extends Controller
{
    protected $api_key;
    protected $api_secret;

    public function __construct()
    {
        $this->api_key = env('API_KEY');
        $this->api_secret = env('API_SECRET');
    }

    protected function hmacHandler() {
        $key = $this->api_key;
        $req_method = 'get';
        $path_query = 'https://api.combell.com/';
        $timestamp = time();
        $nonce = substr(md5(uniqid(mt_rand(), true)), 0, 8);
        $content = '';

        $valueToSign = $this->api_key
            . $req_method
            . urlencode($path_query)
            . $timestamp
            . $nonce
            . $content;

        $signedValue = hash_hmac('sha256', $valueToSign, $this->api_secret, true);

        $signature = base64_encode($signedValue);

        return sprintf('hmac %s:%s:%s:%s', $this->api_key, $signature, $nonce, $timestamp);
    }

    public function index() {

        dd($this->getTestData());
    }

    public function getTestData() {
        $client = new Client();
        $uri = 'https://api.combell.com/v2/accounts';
        $header = ['headers' => ['Authorization' => $this->hmacHandler()]];
        $res = $client->get($uri, $header);
        return json_decode($res->getBody()->getContents(), true);
    }
}

Я не уверен, что моя функция hmac неверна или я использую заголовок авторизации Guzzle вНеправильный путь, какие-либо советы?

Документация Combell API

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Я считаю, что в вашем заголовке отсутствует информация.

signatureString идентифицирует части, используемые в кодировке, и также должно содержаться в заголовке.

Пример:

$date = gmdate("D, d M Y H:i:s") . " GMT";
$signingString = "Date: $date";
$signature = base64_encode(hash_hmac('sha1', $signingString, $secret, true));
$authorization = "hmac username=\"$user\", algorithm=\"hmac-sha1\", headers=\"Date\", signature=\"$signature\"";

$headers = ['Content-Type' => 'application/json',
        'Date' => $date,
        'Authorization' => $authorization,
        'Content-MD5' => $bodyHash ];

$options = [
   'headers' => $header,
   'json' => $body];
$response = $client->request('POST', $uri, $options);

В этом примере '*Поле 1009 * Date 'передается в заголовке со значением, используемым в кодировке (signatureString) с секретом, а заголовок' Authorization 'определяет, какиеполя для захвата в подполе ' headers ' как часть декодирования.

0 голосов
/ 06 декабря 2018

Согласно ответу, заголовок Авторизация в порядке (синтаксис для добавления заголовка выглядит хорошо), но значение неверно.

В документе указано, что путь должен быть относительным.Попробуйте заменить

$path_query = 'https://api.combell.com/';

на

$path_query = '/v2/accounts'; (или /accounts, документ не ясен).

Содержимое не должно быть необходимым, потому что тело пусто.

...