Создание поста с помощью REST API, curl и oauth, возвращающего ошибку 401

Вопрос или проблема

Я пытаюсь создать запись в WordPress с использованием REST API, OAuth и cURL. Однако у меня возникают некоторые проблемы.

Мне удаётся создать пустую запись (без заголовка, слага и т. д.) с помощью следующего кода:

$header = array(buildAuthorizationHeader($oauth), 'Expect:');
$options = array( CURLOPT_HTTPHEADER => $header,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_POST => true,
    CURLOPT_URL => $url,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => false);

Это работает, как и ожидалось — авторизация проходит успешно, и создаётся пустая запись в WordPress. Однако, когда я пытаюсь установить заголовок (или любое другое свойство), добавив

CURLOPT_POSTFIELDS => "title=testTitle",

я получаю ошибку:

{
"data": {
    "code": "json_oauth1_signature_mismatch",
    "message": "Подпись OAuth не совпадает",
    "data": {
        "status": 401
    }
},
"headers": [],
"status": 401
}

Интересно, что мне удаётся установить заголовок с успехом, используя Postman. Есть идеи, что я делаю не так? Буду очень признателен за помощь — я занимаюсь этим уже несколько часов.

“REST API использует JSON исключительно в качестве формата запроса и ответа, включая ответы об ошибках.”

Справка по REST API WordPress

Я бы попробовал явно задать тип контента/длину и закодировать ваши данные в JSON с помощью что-то вроде этого (если вам нужно указать все параметры, которые вы использовали в предоставленном вами коде):

$data = array(
    'title' => 'testTitle',
    'content' => '',
);

$data = json_encode( $data );

$header = array(
    buildAuthorizationHeader( $oauth ),
    'Content-Type: application/json',
    'Content-Length: ' . strlen( $data ),
    'Expect:',
);

$options = array(
    CURLOPT_HTTPHEADER => $header,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_POST => true,
    CURLOPT_URL => $url,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_POSTFIELDS => $data,
);

Ответ или решение

Для успешного создания поста в WordPress через REST API с использованием OAuth и cURL, необходимо убедиться, что вы правильно формируете запрос и отправляете данные в нужном формате. Ошибка 401 с сообщением "OAuth signature does not match", которую вы получаете, указывает на то, что подпись OAuth не соответствует ожидаемой, что может происходить из-за неправильного формата или содержания запроса.

Вот пошаговый подход для устранения данной проблемы:

  1. Формат отправляемых данных: Ваша ошибка может быть связана с тем, что WordPress REST API ожидает данные в формате JSON. Вам необходимо использовать json_encode() для сериализации вашего массива данных.

  2. Заголовки запроса: Убедитесь, что в заголовках вашего запроса установлен заголовок Content-Type как application/json. Это позволит серверу корректно обработать входящие данные.

Вот исправленный код с учётом всех вышеупомянутых моментов:

$data = array(
    'title' => 'testTitle',
    'content' => '', // Вы можете добавить содержимое поста, если нужно
);

$data = json_encode($data);

$header = array(
    buildAuthorizationHeader($oauth), // Убедитесь, что эта функция работает корректно
    'Content-Type: application/json',
    'Content-Length: ' . strlen($data),
    'Expect:',
);

$options = array(
    CURLOPT_HTTPHEADER => $header,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_POST => true,
    CURLOPT_URL => $url, // Убедитесь, что URL правильный
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_POSTFIELDS => $data,
);

// Инициализация cURL
$ch = curl_init();
curl_setopt_array($ch, $options);

// Выполнение запроса
$response = curl_exec($ch);

// Проверка на ошибки
if(curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}

// Закрытие cURL соединения
curl_close($ch);

// Печать ответа
echo $response;

Важные моменты:

  • Функция buildAuthorizationHeader(): Убедитесь, что данная функция формирует корректный заголовок авторизации OAuth, включая все обязательные параметры.

  • Правильный URL: Проверьте, что переменная $url указывает на правильный эндпоинт для создания поста, например, https://yourwebsite.com/wp-json/wp/v2/posts.

  • Проверка других параметров: Если вы добавляете другие свойства к посту, убедитесь, что они поддерживаются в REST API и правильно формируются.

Следуя приведённым рекомендациям, вы сможете устранить ошибку 401 и успешно создать пост в WordPress с помощью REST API, OAuth и cURL. Если ошибка все еще возникает, пожалуйста, проверьте логи сервера и убедитесь, что все ключи и токены корректны.

Оцените материал
Добавить комментарий

Капча загружается...