Создание кастомного REST API для пользовательской авторизации в WordPress

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.

При необходимости интеграции с внешними сервисами или нестандартными механизмами аутентификации такой подход будет самым гибким и масштабируемым.

Шаблоны для WP Плагины для WP