Генерация подписи OAuth 1 в PHP - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь подключиться к API истории взаимодействия LivePerson , и я столкнулся с проблемой, которая, по моему мнению, связана с генерируемой подписью.

Прежде всего, API уже предоставляет необходимый ключ потребителя, секрет потребителя, токен доступа и секрет токена.Так что мне не нужно проходить через процесс их извлечения.Чтобы получить доступ к их API, я просто должен предоставить заголовок аутентификации .Я все испортил, используя Почтальон, и все работает правильно.Проблема в том, когда я пытаюсь сгенерировать свою собственную метку времени / одноразовый номер / подпись в моем классе.

Вот метод из моего класса, который отправляет запрос cURL:

private function execute($options = array())
{
    if (!isset($options['url'])) {
        return;
    }

    $ch = curl_init($options['url']);

    $method = (isset($options['method'])) ? $options['method'] : 'GET';

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);

    if (isset($options['auth']) && $options['auth']) {
        $timestamp = round(microtime(true) * 1000);
        $nonce = $this->getNonce(11);
        $version = "1.0";
        $signatureMethod = "HMAC-SHA1";
        $signature = $this->generateSignature($options, $timestamp, $nonce, $signatureMethod, $version);

        $authHeader = "Authorization: OAuth oauth_consumer_key=\"{$this->consumerKey}\",oauth_token=\"{$this->accessToken}\",oauth_signature_method=\"{$signatureMethod}\",oauth_timestamp=\"{$timestamp}\",oauth_nonce=\"{$nonce}\",oauth_version=\"{$version}\",oauth_signature=\"{$signature}\"";

        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            $authHeader,
            "Content-Type: application/json"
        ));
    }

    if (isset($options['body']) && !empty($options['body'])) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($options['body']));
    }

    $result = curl_exec($ch);
    curl_close($ch);

    return $result;
}

Метод getNonce, который я скопировал почти напрямую из https://github.com/BaglerIT/OAuthSimple/blob/master/src/OAuthSimple.php.

Вот метод, который я написал для генерации подписи (которая была собрана из различных публикаций SO и других источников):

protected function generateSignature($request, $timestamp, $nonce, $signatureMethod, $version)
{
    $base = $request['method'] . "&" . rawurlencode($request['url']) . "&"
        . rawurlencode("oauth_consumer_key=" . rawurlencode($this->consumerKey)
        . "&oauth_nonce=" . rawurlencode($nonce)
        . "&oauth_signature_method=" . rawurlencode($signatureMethod)
        . "&oauth_timestamp=" . $timestamp
        . "&oauth_version=" . $version);

    $key = rawurlencode($this->consumerSecret) . '&' . rawurlencode($this->tokenSecret);
    $signature = base64_encode(hash_hmac('sha1', $base, $key, true));

    return $signature;
}

Я действительно могу скопировать и вставить заголовок авторизации из Postman в мой $authHeader переменная, и заменить все, кроме отметки времени / nonce / signature, и это работает.

Ответ, который я сейчас получаю от их сервера, [code] => 0005, но я не могу найти в их документах ничего о кодах ответов.

Редактировать: я пропустил просмотр ответазаголовок - точная ошибка неверной подписи.

1 Ответ

0 голосов
/ 16 октября 2018

Я изменил 2 вещи, чтобы заставить это работать.Я пропустил oauth_token при создании базовой строки для подписи - и в соответствии с документацией OAuth Core 1.0 «Параметры сортируются по имени с использованием лексикографического порядка следования байтов».

В итоге я переупорядочил параметры по алфавиту.Вот как в итоге получился код для генерации базовой строки:

$base = $request['method'] . "&" . rawurlencode($request['url']) . "&"
        . rawurlencode("oauth_consumer_key=" . rawurlencode($this->consumerKey)
        . "&oauth_nonce=" . rawurlencode($nonce)
        . "&oauth_signature_method=" . rawurlencode($signatureMethod)
        . "&oauth_timestamp=" . rawurlencode($timestamp)
        . "&oauth_token=" . rawurlencode($this->accessToken)
        . "&oauth_version=" . rawurlencode($version));

Я также переупорядочил параметры в заголовке auth, чтобы они соответствовали порядку базовой строки:

$authHeader = "Authorization: OAuth oauth_consumer_key=\"{$this->consumerKey}\",oauth_nonce=\"{$nonce}\",oauth_signature_method=\"{$signatureMethod}\",oauth_timestamp=\"{$timestamp}\",oauth_token=\"{$this->accessToken}\",oauth_version=\"{$version}\",oauth_signature=\"{$signature}\"";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...