Параметры запроса URL-адреса PHP в Etsy OAuth 1.0 не работают

Получив все учетные данные, я теперь запрашиваю ресурс у Etsy API. Он отлично работает без параметров запроса к URL-адресу, но когда я добавляю их, я получаю недействительную подпись.

Вот что у меня получилось без параметров запроса в URL:

// enconding, sorting and creating the base URI
function buildBaseString($baseURI, $method, $params){
            $r = array();
            ksort($params);
            foreach($params as $key=>$value){
                $r[] = "$key = " . rawurlencode($value);
            }

            return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
        }

        // create encoded header
        function buildAuthorizationHeader($oauth){
            $r = 'Authorization: OAuth ';
            $values = array();
            foreach($oauth as $key=>$value)
                $values[] = "$key=\"" . rawurlencode($value) . "\"";

            $r .= implode(', ', $values);
            return $r;
        }
        $consumer_key              = 'the_key';
        $consumer_secret           = 'the_secret';
        $shop_id                   = '00000000000';
        $oauth_access_token        = 'access_token';
        $oauth_access_token_secret = 'token_secret';

$receipts_by_status_url    = 'https://openapi.etsy.com/v2/shops/'.$shop_id.'/receipts/opens';

$oauth = array(
            'oauth_callback'         => 'oob',
            'oauth_consumer_key'     => $consumer_key,
            'oauth_nonce'            => time(),
            'oauth_signature_method' => 'HMAC-SHA1',
            'oauth_timestamp'        => time(),
            'oauth_token'            => $oauth_access_token,
            'oauth_version'          => '1.0',
            );


        $base_info = buildBaseString($receipts_by_status_url, 'GET', $oauth);
        $composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
        $oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
        $oauth['oauth_signature'] = $oauth_signature;

        $header = array(buildAuthorizationHeader($oauth), 'Expect:', 'Content-Type: application/x-www-form-urlencoded');


        /*
         * Set curl options
         */
        //ob_start();
        //$curl_log = fopen('php://output', 'w');

        $ch = curl_init($receipts_by_status_url);

        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 25);
        curl_setopt($ch, CURLOPT_VERBOSE, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        // Execute curl
        $result_token = curl_exec($ch);

когда я добавляю параметры в URL: $receipts_by_status_url = 'https://openapi.etsy.com/v2/shops/'.$shop_id.'/receipts/opens/?includes=Listings';

Я получаю недействительную подпись.

$базовая информация:

'GET&https%3A%2F%2Fopenapi.etsy.com%2Fv2%2Fshops%2F12962774%2Freceipts%2Fopen%3Fincludes%3DListings&oauth_callback%3Doob%26oauth_consumer_key%thekey%26oauth_nonce%3D1607965396%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1607965396%26oauth_token%oauthtoken%26oauth_version%3D1.0'

$oauth подпись:

0Dr9wz24LU6NPkO7eKvP//HCOWk=

$ заголовок:

  0 => string 'Authorization: OAuth oauth_callback = "oob", oauth_consumer_key = "consumerkey", oauth_nonce = "1607965396", oauth_signature_method = "HMAC-SHA1", oauth_timestamp = "1607965396", oauth_token = "oauthtoken", oauth_version = "1.0", oauth_signature = "0Dr9wz24LU6NPkO7eKvP%2F%2FHCOWk%3D"' (length=301)
  1 => string 'Expect:' (length=7)
  2 => string 'Content-Type: application/x-www-form-urlencoded

Что я делаю не так?

таким образом вы не передаете параметры в строке запроса, вы меняете URL-адрес

Giacomo M 14.12.2020 18:17

Забыл знак вопроса в вопросе, мб.

Ozzy 14.12.2020 18:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
489
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я заработал.

Я вручную создал базовую строку без функции в вопросе, это было корнем проблемы, потому что, когда я добавил параметры в конечную точку, это не сработало.

Сервер берет параметры в заголовке авторизации и создает подпись OAuth и сравнивает ее с вашей, если они не совпадают, вы получите недействительную подпись, как в моем случае.

Базовая строка должна состоять из 3 фрагментов данных, соединенных вместе и закодированных в формате rawurlencode:

Http-метод '&' конечная точка URL-адреса '&' параметры

Вещи, чтобы убедиться:

  1. Использовать конечную точку URL без параметров запроса
  2. Убедитесь, что вся базовая строка содержит только два амперсанда.
  3. Отсортировать параметры по алфавиту.
  4. Воспользуйтесь Postman и успейте отправить туда запрос, после этого вы сможете сравнить сгенерированную там в шапке подпись со своей, когда сможете сопоставить, то должно работать.
  5. Убедитесь, что вы используете длинный URL-адрес (с параметрами запроса) в cURL, чистый — только для создания базовой строки.
  6. Я не заметил, но Etsy на самом деле отправляет базовую строку, которую они создали из параметров в ответе, когда подпись недействительна, все, что мне нужно было сделать, это сравнить мою с их и исправить.

Надеюсь, я помог кому-нибудь

Другие вопросы по теме