Palych_tw
@Palych_tw
Типа веб-разработчик

Как правильно защитить REST маршрут?

Как правильно добавить nonce в запрос на rest маршрут? Маршрут кастомный. Сейчас я сделал так.

1. Добавил nonce и отправляю его вместе с запросом
wp_localize_script( 'app-js', 'app_data', [
        'site_url' => get_site_url(),
        'my_nonce' => wp_create_nonce('string')
    ] );

jQuery.ajax({
                    url: window.app_data.site_url + '/wp-json/my-form/send',
                    dataType: 'json',
                    data: {
                        formData: formData,
                        my_nonce: window.app_data.my_nonce,
                    },
                    method: 'POST',
                    success: function (data) { },
                    error: function (data) {}
                });


2. В обработчике проверяю nonce и возвращаю ошибку, если что-то не так.
if(!wp_verify_nonce($_POST['my_nonce'], 'string')) {
        wp_send_json_error(['message' => 'Unauthorized'], 422);
    }


Все это работает нормально, но только для незалогиненых юзеров, после авторизации на сайте возвращается 422.
Этот маршрут должен быть открыт для всех юзеров. Я просто до конца не понял как защищать rest api в wordpress от csrf. Читал, что нужно добавлять nonce в поле wp_rest и тогда WP автоматом проверит юзера, но как я понял, это все нужно для авторизации существующего юзера, а не просто для csrf-защиты.
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
deniscopro
@deniscopro Куратор тега WordPress
WordPress-разработчик, denisco.pro
В WordPress есть обертка для Ajax-запросов к REST API. Можете подключить её в свою тему
wp_enqueue_script( 'wp-api-request' );

Ну и потом использовать аналогично jQuery Ajax
wp.apiRequest({
	method: 'post',
	path: 'my-form/send/',
	data: data,
	success: function (response) {
		console.log(response);
	}
});

WordPress сам сгенерирует и отправит csrf-токен по заголовку X-WP-Nonce.

Подробнее как устроен враппер можно посмотреть в исходниках.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы