WP-API Извлечение черновиков «Одноразовый файл cookie недействителен»

Я работаю над интерфейсным приложением, которое связано с WordPress API, который находится в отдельном домене.

Я хочу получить черновик сообщения, поэтому, когда пользователь нажимает «Предварительный просмотр сообщения» в админ-панели WordPress, он открывает мое приложение с правильным содержимым.

Я загружаю некоторый Javascript в WP Admin, чтобы я мог изменить все ссылки «Preview Post» в админ-панели с помощью токена wp_nonce для целей аутентификации. Это делается с помощью приведенного ниже фрагмента, в который, например, добавлена ​​ссылка для предварительного просмотра: http://example.com/blog?p=127&preview=true&auth=16045802ee

function admin_inline_js(){

// Grab URL
echo '
<script>
document.addEventListener("DOMContentLoaded", function() {
// Grab all preview anchors
var anchors = document.querySelectorAll("a[href*=\'preview=true\']"), i;
// Loop through and amend to remove the trailing slash, as WP doesnt provide any easy method to achieve this.
for(i = 0; i < anchors.length; i++) {
anchors[i].href = anchors[i].href.replace("blog/", "blog") + \'&auth=' . wp_create_nonce('wp_rest') .'\';
}
});
</script>
';
}
add_action( 'admin_print_scripts', 'admin_inline_js' );

В http://example.com/blog?p=127&preview=true&auth=16045802ee, auth Затем этот параметр используется для отправки запроса обратно в WordPress для извлечения черновика с идентификатором 127 с одноразовым токеном 16045802ee, Однако это не работает, и я получаю этот ответ:

object(stdClass)#459 (3) { ["code"]=> string(25) "rest_cookie_invalid_nonce" ["message"]=> string(23) "Cookie nonce is invalid" ["data"]=> object(stdClass)#532 (1) { ["status"]=> int(403) } }

Кто-нибудь может заметить, что я здесь делаю неправильно? : /

Благодарю.

1

Решение

Есть две проблемы, с которыми вы сталкиваетесь:

  1. WordPress «nonce» — это инструмент, который предназначен только для защиты от токенов CSRF. Действительно полезно при написании плагинов для админ-панели, но не полезно для аутентификации по API.

  2. Передача подробностей аутентификации через API блокируется заданным по умолчанию файлом .htaccess.

Чтобы получить ответы, содержащие защищенные данные, необходимо передать данные аутентификации через API. Для простоты я рекомендую сначала использовать HTTP Basic Auth, чтобы при необходимости улучшить код с помощью более безопасных методов аутентификации, таких как OAuth, в будущем.

Я рекомендую создавать нового пользователя специально для использования API, а не передавать детали администратора в текстовых файлах на вашем сервере.

Создав пользователя, вы можете запросить черновик сообщения, используя простой cURL в PHP, следующим образом:

$apiUsername = "apiuser";
$apiPassword = "sup3r-s3cr3t-p455w0rd";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/wp-json/wp/v2/posts/127");
curl_setopt($ch, CURLOPT_USERPWD, "$apiUsername:$apiPassword");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
$postObject = json_decode($json);

Это установит заголовок запроса, содержащий имя пользователя и пароль, и, пока ничто не мешает этому заголовку, прежде чем он попадет в WordPress, вы получите ваши данные в $postObject и вы можете перестать читать здесь. Вы сделали


Однако, для некоторого дополнительного удовольствия, предписанный WordPress по умолчанию .htaccess Файл сбрасывает заголовки HTTP, поэтому, если вы используете его, вам нужно исправить это самостоятельно. В основном, сценарии WordPress должны видеть PHP_AUTH_USER а также PHP_AUTH_PW ключи в пределах $_SERVER Переменная для этого, чтобы работать.

Быстрое решение состоит в том, чтобы включить следующее правило в качестве первого RewriteRule в .htaccess:

RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]

который разделит заголовки на переменные с префиксом «REMOTE_USER», и следующий PHP может быть использован для заполнения ожидаемых полей снова (возможно, это может быть сделано в index.php).

$userPass = $_SERVER["REDIRECT_REMOTE_USER"];
if(!empty($userPass)
&& strstr($userPass, "Basic")) {
$userPass = substr($userPass, strpos($userPass, " ") + 1);
$userPass = base64_decode($userPass);
$userPass = explode(":", $userPass);

$_SERVER['PHP_AUTH_USER'] = $userPass[0];
$_SERVER['PHP_AUTH_PW'] = $userPass[1];
}
0

Другие решения

Я нашел эту ошибку [{"code":"json_cookie_invalid_nonce","message":"Cookie nonce is invalid"}]
после того, как я установил WP POS, когда время открытия POS-страницы ОШИБКА «запрещено»

после расширения ошибка
Я получаю это сообщение [{"code":"json_cookie_invalid_nonce","message":"Cookie nonce is invalid"}]

Через некоторое время я нашел решение. Я деактивирую вновь установленные плагины по одному, я обнаружил проблему в плагине «Yoast SEO» после деактивации, это плагины POS, работающие нормально, затем снова активирую плагин Yoast SEO без проблем, он работает нормально

0

По вопросам рекламы [email protected]