Я работаю над интерфейсным приложением, которое связано с 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) } }
Кто-нибудь может заметить, что я здесь делаю неправильно? : /
Благодарю.
Есть две проблемы, с которыми вы сталкиваетесь:
WordPress «nonce» — это инструмент, который предназначен только для защиты от токенов CSRF. Действительно полезно при написании плагинов для админ-панели, но не полезно для аутентификации по API.
Передача подробностей аутентификации через 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];
}
Я нашел эту ошибку [{"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 без проблем, он работает нормально