WordPress из коробки предоставляет REST API с базовой авторизацией через cookie и nonce, а также поддержку OAuth и Basic Auth. Однако в ряде проектов требуется реализовать собственную, более гибкую систему авторизации для REST API — например, через токены, JWT или иные механизмы. В этой статье мы разберём, как создать кастомный REST API эндпоинт в WordPress с пользовательской авторизацией, используя WPAPI-подход и примеры кода.
Почему нужна кастомная авторизация в REST API WordPress
Стандартная авторизация WordPress REST API не всегда подходит для SPA, мобильных приложений или интеграций с внешними сервисами. К примеру, если нужно:
- Авторизовать пользователя по токену (Bearer Token) вместо cookie.
- Использовать JWT (JSON Web Token) для безопасной передачи данных.
- Ограничить доступ к определённым эндпоинтам по ролям или нестандартным условиям.
- Реализовать интеграцию с внешними системами с кастомной проверкой.
В таких случаях приходится создавать собственные методы проверки авторизации — и WordPress позволяет это сделать через хуки REST API.
Создание кастомного REST API эндпоинта с проверкой токена
Давайте создадим эндпоинт /wp-json/wpapi/v1/userdata, который возвращает данные текущего пользователя, но только если в заголовке запроса передан валидный токен в виде Authorization: Bearer <token>.
Регистрация маршрута REST API
add_action('rest_api_init', function () {
register_rest_route('wpapi/v1', '/userdata', [
'methods' => 'GET',
'callback' => 'wpapi_get_userdata',
'permission_callback' => 'wpapi_permission_check',
]);
});
Здесь мы создаём маршрут с namespace wpapi/v1 и endpoint /userdata. Важна функция permission_callback, она выполняет проверку прав доступа.
Функция проверки прав доступа по токену
function wpapi_permission_check(WP_REST_Request $request) {
$auth_header = $request->get_header('authorization');
if (!$auth_header) {
return new WP_Error('rest_forbidden', 'Authorization header missing', ['status' => 401]);
}
if (preg_match('/Bearer\s+(\S+)/', $auth_header, $matches)) {
$token = $matches[1];
// Проверяем токен (в примере просто сравним с жёстко заданным)
if ($token === 'secret-token-123') {
return true; // Авторизация успешна
}
}
return new WP_Error('rest_forbidden', 'Invalid token', ['status' => 403]);
}
В реальном проекте вместо жёстко заданной строки используйте хранение токенов в базе или JWT верификацию.
Обработчик запроса
function wpapi_get_userdata(WP_REST_Request $request) {
$user = wp_get_current_user();
if (!$user->exists()) {
return new WP_Error('rest_forbidden', 'User not found', ['status' => 404]);
}
return [
'ID' => $user->ID,
'username' => $user->user_login,
'email' => $user->user_email,
'roles' => $user->roles,
];
}
Здесь возвращаем базовую информацию о пользователе, если авторизация прошла.
Добавление поддержки JWT для авторизации в WPAPI
Для более серьёзных проектов удобно использовать JWT (JSON Web Tokens). Плагин JWT Auth для WordPress поможет быстро интегрировать JWT авторизацию.
Установка и базовая настройка плагина JWT Auth
- Установите плагин через админку или вручную загрузите с wpshop.ru.
- Добавьте в
wp-config.phpсекретный ключ:define('JWT_AUTH_SECRET_KEY', 'ваш_случайный_секретный_ключ'); - Проверьте, что сервер поддерживает заголовок Authorization.
Пример получения токена и использования его в запросах
Для получения токена отправьте POST-запрос на /wp-json/jwt-auth/v1/token с параметрами username и password. В ответ придёт JWT токен, который можно использовать в заголовке Authorization.
Практические советы по безопасности кастомной авторизации
Создавая собственные методы авторизации, важно учесть следующие моменты:
- Используйте HTTPS для защиты данных в пути.
- Храните секреты и ключи вне репозитория, например, в переменных окружения.
- Регулярно обновляйте и проверяйте используемые библиотеки и плагины.
- Логируйте неудачные попытки доступа для мониторинга.
- Ограничивайте права пользователя, минимизируя доступ к API.
Заключение по кастомной авторизации REST API
Создание кастомной авторизации в WordPress REST API — задача, с которой сталкиваются многие разработчики. Используя примеры из этой статьи и плагины, например JWT Auth, вы сможете обеспечить безопасный и удобный доступ к своим данным через REST API.
При необходимости интеграции с внешними сервисами или нестандартными механизмами аутентификации такой подход будет самым гибким и масштабируемым.