В стандартной реализации WordPress для авторизации пользователей используются cookie, которые сохраняются в браузере. Однако в некоторых сценариях — например, при интеграции с внешними сервисами, работе с нестандартными клиентами или при повышенных требованиях к безопасности — возникает задача реализовать авторизацию без cookie. Эта статья подробно расскажет, как решить эту задачу, какие есть подводные камни и приведёт примеры кода.
Почему стоит задуматься об авторизации без cookie в WordPress
Cookie являются удобным способом хранения сессий, но они имеют ряд ограничений:
- В некоторых корпоративных или мобильных приложениях cookie могут блокироваться или удаляться.
- При использовании REST API или внешних клиентских приложений cookie не всегда подходят для авторизации.
- Cookie могут быть уязвимы к определённым видам атак, если не настроены должным образом (например, XSS).
Поэтому в ряде случаев требуется реализовать альтернативные методы аутентификации, основанные на передаче токенов или других механизмов.
Основные альтернативы cookie для авторизации
- Токены в заголовках HTTP — например, JWT или кастомные токены.
- Параметры в URL (не рекомендуется из-за риска утечки).
- LocalStorage или SessionStorage браузера (с осторожностью).
В WordPress чаще всего применяют токены, передаваемые через заголовки, особенно для REST API.
Реализация авторизации без cookie через REST API и токены
Рассмотрим пример создания простого плагина, который добавляет поддержку токенов для аутентификации пользователей без cookie.
Создание плагина wpauth-token-auth
Для начала создадим плагин, который будет проверять токен в заголовке Authorization и аутентифицировать пользователя.
<?php
/**
* Plugin Name: WPAUTH Token Auth
* Description: Авторизация в WordPress без cookie через токены в заголовках
* Version: 1.0
* Author: wpauth.ru
*/
// Функция для проверки токена
function wpauth_validate_token_auth() {
// Получаем заголовок Authorization
$headers = apache_request_headers();
if (empty($headers['Authorization'])) {
return;
}
$auth_header = $headers['Authorization'];
// Ожидаем формат: Bearer TOKEN
if (strpos($auth_header, 'Bearer ') !== 0) {
return;
}
$token = substr($auth_header, 7);
// В реальном случае здесь должна быть проверка токена в базе или JWT валидация
// Для примера допустим, что токен - это user_login в базе
$user = get_user_by('login', $token);
if ($user) {
// Авторизуем пользователя без использования cookie
wp_set_current_user($user->ID);
wp_set_auth_cookie($user->ID, false, false); // Можно не ставить cookie, если нужно
}
}
add_action('init', 'wpauth_validate_token_auth');
// Отключаем проверку cookie при REST API, если авторизация по токену прошла
function wpauth_rest_check_auth($result) {
if (is_wp_error($result)) {
return $result;
}
if (is_user_logged_in()) {
return true;
}
return $result;
}
add_filter('rest_authentication_errors', 'wpauth_rest_check_auth');
В этом простом плагине мы проверяем заголовок Authorization и если токен совпадает с логином пользователя, автоматически авторизуем этого пользователя без установки cookie. Конечно, для реальных задач необходимо использовать надёжные JWT или OAuth токены.
Использование JWT для авторизации без cookie в WordPress
JWT (JSON Web Token) — популярный стандарт для авторизации без cookie. В WordPress можно использовать плагин JWT Auth от WPShop, который позволяет легко добавить поддержку JWT.
Настройка JWT Auth плагина
- Установите плагин JWT Auth.
- Добавьте в
wp-config.phpсекретный ключJWT_AUTH_SECRET_KEYдля подписи токенов. - Используйте REST API для получения токена и последующих запросов с заголовком
Authorization: Bearer TOKEN.
Пример запроса на получение токена:
POST /wp-json/jwt-auth/v1/token
Content-Type: application/json
{
"username": "user",
"password": "password"
}
Пример использования токена в заголовке при дальнейшем запросе:
GET /wp-json/wp/v2/posts
Authorization: Bearer your_jwt_token_here
Реализация кастомной авторизации без cookie с помощью фильтров
Если не использовать REST API, а нужно стандартную авторизацию без cookie, можно применить фильтры WordPress.
Пример: авторизация через заголовок и хранение сессии в базе
Можно реализовать авторизацию, когда пользователь передаёт токен в заголовке, а сессия хранится в базе, без cookie.
<?php
// Проверка токена авторизации
function wpauth_authenticate_header_token() {
$headers = apache_request_headers();
if (empty($headers['X-Auth-Token'])) {
return;
}
$token = $headers['X-Auth-Token'];
global $wpdb;
$user_id = $wpdb->get_var($wpdb->prepare("SELECT user_id FROM {$wpdb->prefix}usermeta WHERE meta_key='wpauth_token' AND meta_value=%s", $token));
if ($user_id) {
wp_set_current_user($user_id);
// Не ставим cookie
}
}
add_action('init', 'wpauth_authenticate_header_token');
// Генерация токена при логине
function wpauth_generate_token_on_login($user_login, $user) {
$token = bin2hex(random_bytes(16));
update_user_meta($user->ID, 'wpauth_token', $token);
}
add_action('wp_login', 'wpauth_generate_token_on_login', 10, 2);
Такой механизм позволяет авторизовать пользователя по токену из заголовка X-Auth-Token. Токен генерируется при входе и сохраняется в мета пользователя.
Безопасность и подводные камни авторизации без cookie
Реализация авторизации без cookie требует особого внимания к безопасности:
- Токены должны быть надёжно сгенерированы и иметь ограниченный срок действия.
- Передача токена должна осуществляться по HTTPS, чтобы избежать перехвата.
- Не рекомендуется передавать токены в URL из-за риска утечки в логах и реферерах.
- Следите за безопасностью хранения токенов на стороне клиента, если используете LocalStorage или SessionStorage.
- Регулярно проверяйте и обновляйте токены, чтобы ограничить время жизни сессии.
Выводы и рекомендации
Авторизация без cookie в WordPress — задача нетривиальная, но выполнимая. Для REST API и внешних клиентов идеальным вариантом будет использование JWT с плагином JWT Auth от WPShop. Для более кастомных решений можно реализовать проверку токенов в заголовках и аутентификацию пользователей без установки cookie, как показано в примерах кода выше.
Важно тщательно продумывать безопасность и избегать распространённых ошибок при работе с токенами и сессиями. Такой подход расширит возможности авторизации и сделает ваш WordPress-сайт более гибким для интеграций и нестандартных сценариев.