wpmake.ru wordpress WPMake

Как использовать REST API для авторизации по токену в WordPress

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

Почему использовать авторизацию по токену в WordPress REST API

Стандартный WordPress REST API использует cookie-сессию для авторизации, что удобно для классических сайтов, но неудобно для внешних приложений и мобильных устройств. Авторизация по токену (например, JWT — JSON Web Token) позволяет:

  • Безопасно аутентифицировать пользователя без передачи логина и пароля при каждом запросе;
  • Поддерживать бесшовный опыт для SPA и мобильных приложений;
  • Обеспечить управление сроком действия сессии и возможностью аннулирования токена;
  • Интегрироваться с внешними сервисами, где cookie не работают.

Для реализации такой схемы нам потребуется создать REST API endpoint, который будет принимать токен и возвращать данные пользователя при успешной аутентификации.

Создание REST API эндпоинта для авторизации по токену в WordPress

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

Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:

add_action('rest_api_init', function () {
    register_rest_route('wpmake/v1', '/auth-token', array(
        'methods' => 'POST',
        'callback' => 'wpmake_auth_token_callback',
        'permission_callback' => '__return_true',
    ));
});

function wpmake_auth_token_callback(WP_REST_Request $request) {
    $token = $request->get_param('token');

    if (empty($token)) {
        return new WP_REST_Response(array('error' => 'Token is missing'), 400);
    }

    // Проверяем токен (пример проверки, реализация зависит от способа генерации токена)
    $user_id = wpmake_verify_token($token);
    if (!$user_id) {
        return new WP_REST_Response(array('error' => 'Invalid token'), 401);
    }

    $user = get_userdata($user_id);
    if (!$user) {
        return new WP_REST_Response(array('error' => 'User not found'), 404);
    }

    // Возвращаем данные пользователя без чувствительной информации
    return array(
        'id' => $user->ID,
        'login' => $user->user_login,
        'email' => $user->user_email,
        'roles' => $user->roles
    );
}

// Пример функции проверки токена
function wpmake_verify_token($token) {
    // Здесь нужно реализовать логику проверки токена
    // Например, расшифровка JWT или поиск в базе
    // Для простоты — имитация проверки
    if ($token === 'example_valid_token') {
        return 1; // ID пользователя
    }
    return false;
}

В этом примере мы создали POST-эндпоинт /wp-json/wpmake/v1/auth-token, который принимает параметр token и возвращает данные пользователя при успешной проверке.

Генерация и выдача токенов для пользователей WordPress

Чтобы использовать авторизацию по токену, нужно обеспечить механизм выдачи этих токенов. На практике чаще всего применяют JWT. Для WordPress существуют готовые плагины, например JWT Authentication for WP REST API, которые упрощают этот процесс.

Если хотите собственную реализацию, можно сделать так:

  • Создать endpoint для логина, который проверяет логин и пароль;
  • При успешной аутентификации генерирует уникальный токен (например, JWT или случайную строку);
  • Сохраняет токен в базе с привязкой к пользователю и сроком действия;
  • Возвращает токен клиенту.

Пример генерации простого токена (не JWT) и сохранения в user meta:

function wpmake_generate_token_for_user($user_id) {
    $token = bin2hex(random_bytes(16));
    update_user_meta($user_id, '_wpmake_auth_token', $token);
    return $token;
}

function wpmake_verify_token($token) {
    $users = get_users(array(
        'meta_key' => '_wpmake_auth_token',
        'meta_value' => $token,
        'number' => 1,
        'count_total' => false
    ));
    if (!empty($users)) {
        return $users[0]->ID;
    }
    return false;
}

Такой подход прост, но не защищен от некоторых атак. Гораздо лучше использовать JWT с подписью и сроком жизни.

Пример использования плагина JWT Authentication for WP REST API

Чтобы быстро запустить авторизацию по токену, рекомендуем использовать плагин JWT Authentication for WP REST API:

  • Установите и активируйте плагин через админку WordPress.
  • Добавьте в wp-config.php секретный ключ JWT, например: define('JWT_AUTH_SECRET_KEY', 'ваш_случайный_секрет');
  • Получите токен, отправив POST-запрос на /wp-json/jwt-auth/v1/token с параметрами username и password.
  • Используйте полученный токен в заголовке Authorization: Bearer ваш_токен для доступа к защищенным эндпоинтам.

Пример запроса получения токена через curl:

curl -X POST https://ваш-сайт.ru/wp-json/jwt-auth/v1/token \
  -d "username=admin&password=пароль"

Ответ будет содержать токен, который нужно передавать в последующих запросах.

Защита собственных REST API маршрутов с использованием токена

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

Пример защиты маршрута с проверкой токена:

add_action('rest_api_init', function () {
    register_rest_route('wpmake/v1', '/private-data', array(
        'methods' => 'GET',
        'callback' => 'wpmake_private_data_callback',
        'permission_callback' => 'wpmake_permission_check',
    ));
});

function wpmake_permission_check(WP_REST_Request $request) {
    $auth_header = $request->get_header('authorization');
    if (!$auth_header) {
        return new WP_Error('no_auth_header', 'Authorization header missing', array('status' => 401));
    }

    if (preg_match('/Bearer\s+(\S+)/', $auth_header, $matches)) {
        $token = $matches[1];
        $user_id = wpmake_verify_token($token);
        if ($user_id) {
            return true;
        }
    }

    return new WP_Error('invalid_token', 'Invalid or missing token', array('status' => 403));
}

function wpmake_private_data_callback(WP_REST_Request $request) {
    return array('data' => 'Это защищенные данные пользователя');
}

Такой подход позволит ограничить доступ к вашим API только авторизованным пользователям с валидным токеном.

Дополнительные рекомендации и инструменты для работы с REST API и авторизацией

Для лучших результатов при работе с авторизацией по токену в WordPress рекомендуем:

  • Использовать проверенные плагины, такие как JWT Authentication for WP REST API;
  • Хранить секретные ключи в wp-config.php и не выкладывать их в публичный доступ;
  • Обеспечить HTTPS для всех запросов, чтобы защитить передачу токенов;
  • Реализовать механизм обновления токена (refresh token), чтобы пользователи не вводили логин и пароль слишком часто;
  • Логировать попытки аутентификации для мониторинга и защиты от взлома.

Также можно расширить функционал с помощью плагина Clearfy Pro, который оптимизирует работу сайта и повышает безопасность.

×
Сделай свой сайт крутым!

Скидка -20% на премиум плагины WordPress

Выбрать плагин сейчас ⋙