Як вимкнути/закрити REST API від публічного доступу?

Я вже відповідав на питання, як повністю відключити REST API.

Однак розробники WordPress настійно НЕ рекомендують повністю відключати REST API, тому що це поламає працездатність WordPress в адмінці з 5 версії, там REST використовується для Блокового редактора контенту запису.

Щоб залишити REST API працездатним, але закрити всі маршрути від публічного доступу, можна використовувати хуки. Тут є кілька варіантів:

Варіант 1:
# Закриває всі маршрути REST API від публічного доступу
add_filter( 'rest_authentication_errors', function( $result ){

	if( is_null( $result ) && ! current_user_can('edit_others_posts') ){
		return new WP_Error( 'rest_forbidden', 'You not currently logged in.', [ 'status'=>401 ] );
	}

	return $result;
} );

Код можна вставити у файл теми functions.php або ще кудись.

Цей код дозволяє доступ до API REST тільки для авторизованих користувачів з правами редактора і вище.

Перевірку ! current_user_can('edit_others_posts')можна замінити більш підходящою для вашого сайту. Наприклад, її можна спростити і зробити REST API доступним для всіх авторизованих користувачів (не будь-які права). Для цього замініть перевірку на ! is_user_logged_in().

ВАЖЛИВО! Закривати маршрути таким чином небезпечно, тому що на сайті можуть бути маршрути для користувачів, наприклад, самбміт форми на фронті. Цей метод закриє абсолютно всі маршрути, у тому числі й ті, які можуть бути створені плагінами або темою для неавторизованих користувачів. Тому рекомендую використовувати варіант нижче через хук rest_pre_dispatch , він дозволяє закрити зазначені маршрути і не чіпати інших.

Варіант 2:

Дуже схожий на перший, але там ми не маємо доступу до запиту і класу REST сервера.

Відразу після хука об’єкт запиту ($ request).

add_filter( 'rest_pre_dispatch', 'close_rest_api_routes', 10, 3);

/**
 * Close REST API routes from public access.
 *
 * @param WP_REST_Response|WP_Error|null $result
 * @param WP_REST_Server $rest_server
 * @param WP_REST_Request $request
 *
 * @return WP_Error
 */
function close_rest_api_routes( $result, $rest_server, $request ){

	// Maybe authentication error already set
	if( ! is_null( $result ) ){
		return $result;
	}

	if(
		// only for `/wp/v2` namespace
		'/wp/v2' === substr( $request->get_route(), 0, 6 )
		// Administrator
		&&! current_user_can( 'manage_options' )
	) {
		return new WP_Error( 'rest_not_logged_in', 'Your capability is low.', [ 'status' => 401 ] );
	}

	return $result;
}
Варіант 3:

Використовуйте плагін Disable WP REST API

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *