REST API в WordPress — мощный инструмент для взаимодействия с сайтом извне. Однако часто возникает задача сделать API приватным, чтобы доступ к нему имели только авторизованные пользователи или определённые приложения. В этой статье разберём, как реализовать приватный REST API в WordPress с помощью аутентификации и фильтрации запросов.
Что такое приватный REST API и зачем он нужен
По умолчанию REST API WordPress доступен публично, что удобно для многих случаев, но не всегда безопасно. Приватный API ограничивает доступ, позволяя только авторизованным пользователям выполнять запросы. Это полезно для мобильных приложений, внутренних сервисов или когда нужно защитить данные от посторонних.
Реализация приватного API включает:
- Аутентификацию запросов
- Проверку прав пользователя
- Защиту от CSRF и других атак
Аутентификация в приватном REST API WordPress
Самый распространённый способ аутентификации — использование куки WordPress, если запрос идёт из браузера авторизованного пользователя. Для внешних приложений лучше использовать токены, например, JWT (JSON Web Tokens) или Basic Auth.
Пример: проверка авторизации через куки
Чтобы ограничить доступ к вашему API, можно использовать хук rest_authentication_errors. Вот функция для wordpressy, которая проверяет авторизацию:
function wordpressy_rest_api_auth_check( $result ) {
if ( true === $result || is_wp_error( $result ) ) {
return $result;
}
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_forbidden', 'Доступ запрещён. Пожалуйста, авторизуйтесь.', array( 'status' => 401 ) );
}
return $result;
}
add_filter( 'rest_authentication_errors', 'wordpressy_rest_api_auth_check' );Этот код проверяет, что пользователь авторизован, иначе возвращает ошибку 401. Таким образом, все запросы к API будут приватными.
Использование JWT для аутентификации
Для более гибкой аутентификации рекомендуем использовать плагин JWT Auth от WPSHOP. Он позволяет выдавать токены сессии и проверять их в запросах.
Пример запроса с JWT:
curl -X POST https://example.com/wp-json/jwt-auth/v1/token \
-d 'username=admin&password=pass123'Ответ содержит токен, который надо добавить в заголовок Authorization:
Authorization: Bearer your_jwt_tokenДалее в API можно проверять токен и разрешать доступ.
Регистрация приватного REST API-эндпоинта
После настройки аутентификации можно создавать эндпоинты, доступные только авторизованным пользователям.
Пример регистрации приватного эндпоинта:
function wordpressy_register_private_endpoint() {
register_rest_route( 'wordpressy/v1', '/userdata', array(
'methods' => 'GET',
'callback' => 'wordpressy_get_userdata',
'permission_callback' => function () {
return is_user_logged_in();
}
) );
}
add_action( 'rest_api_init', 'wordpressy_register_private_endpoint' );
function wordpressy_get_userdata( WP_REST_Request $request ) {
$user = wp_get_current_user();
return array(
'ID' => $user->ID,
'login' => $user->user_login,
'email' => $user->user_email,
);
}В этом примере эндпоинт /wp-json/wordpressy/v1/userdata возвращает данные текущего пользователя, только если он авторизован.
Обеспечение безопасности и ограничения доступа
Важно не только проверить авторизацию, но и ограничить права доступа. Например, можно разрешить вызов только администраторам или определённым ролям.
function wordpressy_permission_callback() {
$user = wp_get_current_user();
if ( in_array( 'administrator', (array) $user->roles ) ) {
return true;
}
return false;
}Используйте эту функцию в параметре permission_callback при регистрации маршрута, чтобы закрыть доступ менее привилегированным пользователям.
Обработка ошибок и отладка приватного REST API
При работе с приватным API важно корректно обрабатывать ошибки и возвращать понятные сообщения. Используйте класс WP_Error для формирования ответов с ошибками и устанавливайте HTTP-статусы.
Например:
return new WP_Error( 'rest_forbidden', 'У вас нет прав для выполнения этого действия.', array( 'status' => 403 ) );Для отладки удобно включать логирование ошибок и использовать плагины, такие как Query Monitor, чтобы отслеживать запросы REST API.
Итоговые рекомендации по созданию приватного REST API в WordPress
- Используйте фильтр
rest_authentication_errorsдля общей проверки авторизации. - Для внешних приложений настройте JWT или Basic Auth.
- Ограничивайте права доступа через
permission_callbackпри регистрации маршрутов. - Корректно обрабатывайте ошибки с помощью
WP_Error. - Тестируйте API запросы с помощью Postman или curl.
Дополнительно рекомендуем ознакомиться с плагином Clearfy Pro, который содержит расширенные настройки безопасности и может помочь в защите REST API.