Вопрос или проблема
Вот интересный эксперимент: перейдите на страницу списка плагинов WordPress, обратите внимание, что ссылки активации и деактивации имеют nonce часть в запросе.
Во второй вкладке выйдите из сайта и вернитесь на страницу списка плагинов.
Через некоторое время страница осознает, что вы не вошли в систему, и появится экран входа. Войдите и нажмите кнопку “активировать” или “деактивировать”.
Обратите внимание, что появляется сообщение о неудаче nonce: “вы уверены, что хотите это сделать”? Потому что nonce предыдущей сессии не работают. Почему WordPress не знает, что нужно обновить эти nonce? Я думал, новые nonce будут отправляться обратно через heartbeat-ajax, но, похоже, с экраном входа нет ajax запроса.
Обновление: Похоже, это вызывается, когда пользователь входит в систему, но, я думаю, не так много скриптов умны, чтобы действовать на этот триггер?
$( document ).on( 'heartbeat-tick.wp-auth-check', function( e, data ) {
if ( 'wp-auth-check' in data ) {
schedule();
if ( ! data['wp-auth-check'] && wrap.hasClass('hidden') ) {
show();
} else if ( data['wp-auth-check'] && ! wrap.hasClass('hidden') ) {
hide();
}
}
}).
потому что система Heartbeat в основном ортогональна остальному WordPress и поэтому на самом деле не осведомлена о содержании страниц, на которых она работает. Поскольку это относительно новая система, у нее, вероятно, есть аспекты, которые не совсем определены или протестированы, и если вы считаете, что есть странное поведение или реальная ошибка, пожалуйста, откройте тикет на WordPress trac – https://core.trac.wordpress.org/
Ответ или решение
Причины, по которым Heartbeat в WordPress не обновляет нонсы, имеют несколько аспектов, связанных с архитектурой системы и особенностями ее реализации.
Проблема и ее контекст
При взаимодействии с плагинами в WordPress данные передаются с помощью нонсов — уникальных токенов, которые защищают систему от злоумышленников. Они используются в запросах активации и деактивации плагинов, и их назначение — подтвердить, что запрос идет от авторизованного пользователя. Однако, когда пользователь выходит из системы, а затем снова входит, нонсы, связанные с предыдущей сессией, не обновляются автоматически. Это приводит к ошибке " nonce failure" при попытке активировать или деактивировать плагин, что вызывает недоумение у пользователей.
Почему это происходит?
-
Независимость системы Heartbeat: Heartbeat API в WordPress отвечает за периодические AJAX-запросы, которые сообщают о состоянии сессии пользователя. Однако, система Heartbeat функционирует несколько изолированно от остального контента страниц. Она не привязана к логике конкретного контента и не знает, какие нонсы должны быть обновлены в зависимости от состояния пользователя. Это значит, что обновление сессии пользователя и обновление нонсов не синхронизированы.
-
Отсутствие автоматического обновления нонсов: Даже если Heartbeat API инициирует обновления при проверке аутентификации (например, через событие
heartbeat-tick.wp-auth-check
), не все скрипты и плагины достаточно интеллектуальны, чтобы правильно реагировать на эти события. Это может быть следствием недостатка интеграции между Heartbeat API и пользовательскими интерфейсами, использующими нонсы. -
Логика обработки событий: Стандартное поведение Heartbeat не включает автоматическую отправку новых нонсов при входе пользователя в систему. Это также может зависеть от конкретного кода плагинов и тем, которые могут не учитывать необходимость обновления нонсов после повторной аутентификации.
Выводы и рекомендации
Проблема с обновлением нонсов через Heartbeat демонстрирует не только ограничения текущей реализации WordPress, но и потенциальные области для улучшения. Необходимо, чтобы разработчики плагинов и тем учитывали сценарии, когда пользователи могут изменять свое состояние авторизации, и соответствующим образом обрабатывали события, связанные с обновлением нонсов.
Рекомендации:
- Обращение к документации: Разработчики должны внимательно изучить документацию WordPress о Heartbeat API и его использовании, чтобы интегрировать обновления нонсов в свои приложения.
- Создание собственных триггеров для обновления: Если вы разрабатываете плагины или темы, подумайте о создании своих триггеров для обновления нонсов на основе событий аутентификации.
- Сообщение о проблемах: Если вы сталкиваетесь с неочевидным поведением, не стесняйтесь сообщать об этом в WordPress Trac. Обратная связь от сообщества помогает улучшать систему и выявлять потенциальные баги.
В заключение, проблема с не обновляющимися нонсами является следствием архитектурных особенностей WordPress и требует более внимательного подхода со стороны разработчиков к обработке событий аутентификации и жизненного цикла нонсов.