WordPress REST API: создание кастомной аутентификации по токену

WordPress REST API давно стал неотъемлемой частью современной разработки на WordPress, позволяя создавать мощные SPA, мобильные приложения и интеграции. Однако по умолчанию для доступа к защищённым ресурсам требуется стандартная авторизация через куки или базовую аутентификацию, что далеко не всегда удобно и безопасно. В этой статье мы рассмотрим, как реализовать кастомную аутентификацию по токену для REST API, что позволит гибко управлять доступом и интегрироваться с внешними системами.

Почему нужна кастомная аутентификация по токену для REST API

Стандартные методы авторизации WordPress REST API — это cookie-auth и Basic Auth. Первый вариант подходит только для запросов из браузера с активной сессией, второй — требует передачи пароля в заголовках, что небезопасно без HTTPS. OAuth2 и JWT — популярные решения, но они требуют установки и настройки дополнительных плагинов и сервисов.

Кастомная аутентификация по токену — это лёгкий, быстрый и расширяемый способ защищать API, особенно если у вас свои требования к безопасности и интеграции. Например, можно выдавать одноразовые токены, токены с ограниченным сроком действия или привязывать их к определённым правам.

В этой статье мы создадим простой плагин, который добавит в WordPress поддержку токеновой аутентификации для REST API. Использовать его можно как основу для более сложных решений.

Создание плагина для токеновой аутентификации в WordPress REST API

Регистрация пользовательского токена и хранение

Для начала нам нужно определиться, где хранить токены и как их выдавать. В простом варианте токены можно хранить в пользовательских метаданных (user meta), а выдавать их администратору вручную или через отдельный endpoint.

Пример функции для генерации и сохранения токена для пользователя:

function wpauth_generate_user_token($user_id) {
    $token = bin2hex(random_bytes(32));
    update_user_meta($user_id, '_wpauth_rest_token', $token);
    return $token;
}

Эта функция создаёт 64-символьный случайный токен и сохраняет его в метаданные пользователя.

Добавление endpoint для получения токена

Чтобы пользователь мог получить токен (например, после авторизации), добавим REST API route:

add_action('rest_api_init', function () {
    register_rest_route('wpauth/v1', '/get-token', [
        'methods' => 'POST',
        'callback' => 'wpauth_get_token_endpoint',
        'permission_callback' => 'is_user_logged_in',
    ]);
});

function wpauth_get_token_endpoint() {
    $user_id = get_current_user_id();
    $token = wpauth_generate_user_token($user_id);
    return ['token' => $token];
}

Этот endpoint возвращает токен текущего пользователя, если он авторизован.

Авторизация запросов к REST API по токену

Теперь нам нужно, чтобы WordPress распознавал токен в заголовках запросов и аутентифицировал пользователя.

Фильтрация аутентификации REST API

WordPress позволяет изменить логику аутентификации через фильтр rest_authentication_errors. Добавим проверку токена из заголовка Authorization:

add_filter('rest_authentication_errors', 'wpauth_rest_authenticate_token');

function wpauth_rest_authenticate_token($result) {
    if (!empty($result)) {
        return $result; // Уже есть ошибка или пользователь аутентифицирован
    }

    $headers = getallheaders();
    if (empty($headers['Authorization'])) {
        return $result; // Нет токена
    }

    $auth_header = $headers['Authorization'];
    if (strpos($auth_header, 'Bearer ') !== 0) {
        return $result; // Не Bearer токен
    }

    $token = substr($auth_header, 7);
    if (!$token) {
        return new WP_Error('rest_forbidden', 'Токен не передан', ['status' => 403]);
    }

    $user = wpauth_get_user_by_token($token);
    if (!$user) {
        return new WP_Error('rest_forbidden', 'Неверный токен', ['status' => 403]);
    }

    wp_set_current_user($user->ID);
    return true; // Аутентификация успешна
}

function wpauth_get_user_by_token($token) {
    $user_query = new WP_User_Query([
        'meta_key' => '_wpauth_rest_token',
        'meta_value' => $token,
        'number' => 1,
        'count_total' => false,
    ]);

    $users = $user_query->get_results();
    if (empty($users)) {
        return false;
    }
    return $users[0];
}

Мы достаём токен из заголовка, ищем пользователя с таким токеном и устанавливаем его текущим.

Пример использования кастомной аутентификации

Теперь, чтобы выполнить запрос к защищённому endpoint, нужно передать заголовок:

Authorization: Bearer your_token_here

Например, получить текущего пользователя через REST API можно так:

fetch('https://example.com/wp-json/wp/v2/users/me', {
    headers: {
        'Authorization': 'Bearer your_token_here'
    }
})
.then(response => response.json())
.then(data => console.log(data));

Дополнительные улучшения

  • Добавить срок действия токена и проверку на истечение.
  • Добавить возможность отозвать токен (удалить из user meta).
  • Реализовать endpoint для удаления и обновления токена.
  • Использовать хеширование токенов для безопасности.

Интеграция с плагинами и расширения для удобства

Если хотите использовать более продвинутые решения, можно обратить внимание на плагины типа Clearfy Pro, которые улучшают безопасность REST API и добавляют дополнительные возможности аутентификации.

Для удобства управления пользователями и токенами можно использовать WPCommunity, расширяющий функционал профилей и авторизации.

Итоги

Реализация кастомной токеновой аутентификации для WordPress REST API позволяет создавать гибкие и безопасные интеграции без необходимости использовать сложные протоколы. Приведённый пример — это базовый каркас, который можно расширять и адаптировать под конкретные задачи.

Используйте этот подход, если вам нужно контролировать доступ к API в нестандартных сценариях или интегрироваться с внешними сервисами, где классическая авторизация WordPress не подходит.

WordPress авторизация без cookie: решение проблем и примеры кода
06.02.2026
WordPress уведомления о входе: как настроить кастомные email-уведомления для администраторов
11.01.2026
WordPress авторизация по OTP без SMS: настройка и примеры кода
10.02.2026
Ограничение количества попыток входа в WordPress: создание кастомного плагина
03.01.2026
Кастомизация процесса восстановления пароля в WordPress: пошаговое руководство
03.03.2026