Диагностика проблем с кэшированием REST API при авторизации и использовании куков
WP REST API широко применяется для динамического обмена данными в WordPress, особенно в темах и плагинах с интерактивным фронтендом и WooCommerce. Однако кэширование REST API-запросов с авторизацией и куками часто приводит к ошибкам: пользователи видят чужие данные, личные данные кэшируются, а также возникают проблемы с обновлением информации.
Основные симптомы:
- Пользователь видит устаревшие или чужие данные в ответах REST API.
- Ошибка сессии или авторизации при повторных запросах.
- Кэш не сбрасывается при смене пользователя или обновлении данных.
Пошаговое решение: как кэшировать REST API с авторизацией и куками корректно
1. Выявляем запросы, которые нужно исключить из общего кэша
REST API-запросы с авторизацией обычно содержат заголовок Authorization или куки сессии. В WP Super Cache можно настроить исключения по URI или заголовкам.
function exclude_auth_rest_requests_from_cache( $cache_enabled ) {
if ( defined('REST_REQUEST') && REST_REQUEST ) {
if ( isset($_SERVER['HTTP_AUTHORIZATION']) || isset($_COOKIE['wordpress_logged_in_']) ) {
return false; // Отключаем кэш для авторизованных REST API запросов
}
}
return $cache_enabled;
}
add_filter( 'wp_cache_can_cache', 'exclude_auth_rest_requests_from_cache' );2. Используем ключи кэша, учитывающие пользователя и куки
Для REST API с авторизацией важно создавать уникальный ключ кэша на пользователя. Можно добавить в ключ часть, основанную на ID пользователя или хеше куков.
function add_user_to_cache_key( $key ) {
if ( is_user_logged_in() && defined('REST_REQUEST') && REST_REQUEST ) {
$user_id = get_current_user_id();
$key .= '_user_' . $user_id;
}
return $key;
}
add_filter( 'wp_cache_key', 'add_user_to_cache_key' );3. Автоматическая очистка кэша при изменении данных через REST API
Если данные обновляются через REST API, нужно сбрасывать соответствующий кэш.
add_action( 'rest_after_insert_post', function( $post, $request, $creating ) {
if ( $creating ) return; // Только при обновлении
if ( function_exists( 'wp_cache_clear_cache' ) ) {
wp_cache_clear_cache(); // Очистка всего кэша - можно оптимизировать
}
}, 10, 3 );Проверка результата после внедрения
- Выполните REST API запросы с авторизацией (через curl или Postman) и проверьте, что ответы соответствуют текущему пользователю.
- Проверьте, что данные обновляются сразу после изменения (например, после редактирования записи через REST API).
- Отсутствие ошибок сессий и правильная работа авторизации.
Частые ошибки и как их исправить
- Кэш не учитывает пользователя: приводит к выдаче чужих данных. Решение — использовать уникальные ключи кэша с ID пользователя.
- Отсутствие исключений для авторизованных REST запросов: кэшируются приватные данные. Нужно отключить кэш для таких запросов или создавать уникальный кэш.
- Недостаточная очистка кэша после обновления данных: данные не обновляются. Добавьте хуки для очистки кэша после изменений.
Практические советы по безопасности и производительности
- Не кэшируйте REST API ответы, содержащие персональные данные, если нет уверенности в безопасности.
- Используйте
wp_cache_getиwp_cache_setдля ручного кэширования сложных запросов с учетом пользователей. - Регулярно проверяйте логи ошибок сервера на предмет сбоев кэша.
Сравнение подходов к кэшированию REST API с авторизацией
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Полное отключение кэша REST API с авторизацией | Исключение запросов с авторизацией из кэша | Безопасно, гарантирует актуальные данные | Увеличенная нагрузка на сервер |
| Кэш с уникальными ключами по пользователю | Кэширование с учётом ID пользователя или куков | Быстро, поддерживает персонализацию | Увеличенный объём кэша, сложнее настроить |
| Ручное кэширование через WP Cache API | Кодовая реализация с контролем обновления | Гибко, можно оптимизировать по бизнес-логике | Требует разработки и поддержки |