Не получается использовать WordPress для работы с приложением wp-rest api

У меня есть приложение, которое должно быть безопасным и, следовательно, с использованием Nonce’s, но я не могу заставить их работать.
Я пробовал несколько вариантов, но, видимо, чего-то не хватает, так как проверка не работает.

Мой фрагмент кода js:

function placeNew(next){
_nonce = $('input#_nonce').val();
request = $.ajax({
type: 'POST',
url: url_path + '/foo/v1/newbee',
data: {bid : next , _nonce : _nonce},
security: '<?php echo wp_create_nonce( "a" ); ?>',
dataType: 'json'
});
request.done(function (response, textStatus, jqXHR){
str = JSON.stringify(response);
if(response["error"]){
alert(response["message"]);
}

Одноразовый номер добавляется на страницу со следующим кодом:

$nonce = wp_create_nonce( 'a' );
echo "<input type='hidden' id='_nonce' value=" . $nonce ."/>";

В php для получения и сравнения одноразового номера используется следующий фрагмент функции:

function ace($request) {
global $wpdb;
$timestamp = time();
$nonce = (string) $request['_nonce'];
$verify = check_ajax_referer( 'a', $nonce, false );
if ( ! $verify){
$errMsg = $nonce . '-'. $verify .' not validated ';
return (object) array(error => true, message => $errMsg);
}

Я всегда получаю сообщение «не подтверждено». $ nonce имеет значение, но $ verify никогда не получает значение.

3

Решение

Согласно документы:

Для разработчиков, выполняющих запросы Ajax вручную, необходимо передать одноразовый номер
с каждым запросом. API использует одноразовые номера с действием, установленным на wp_rest. Эти
затем может быть передано API через параметр данных _wpnonce (либо POST
данные или в запросе для запросов GET), или через заголовок X-WP-Nonce.

Важная часть, которую вам не хватает:

API использует одноразовые номера с действием, установленным на wp_rest.

Чтобы это сработало, вы должны назвать свое действие в wp_create_nonce в wp_rest,

Так что для вашего кода вы должны изменить все экземпляры:

wp_create_nonce( "a" )

в

wp_create_nonce( 'wp_rest' )

Кроме того, как утверждают документы:

Предоставление одноразового номера в качестве заголовка является наиболее надежным подходом.

Так что добавить это в ваш ajax просто и выглядит примерно так:

var _nonce = "<?php echo wp_create_nonce( 'wp_rest' ); ?>";
$.ajax({
type: 'POST',
url: url_path + '/foo/v1/newbee',
data: {
bid : next
},
dataType: 'json',
beforeSend: function ( xhr ) {
xhr.setRequestHeader( 'X-WP-Nonce', _nonce );
}
});

Кроме того, чтобы исправить чек

check_ajax_referer( 'a', $nonce, false )

Теперь должно быть

check_ajax_referer( 'wp_rest', '_nonce', false )
3

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

Других решений пока нет …

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