Почему система WordPress Heartbeat не обновляет нонсы при входе?

Вопрос или проблема

Вот интересный эксперимент: перейдите на страницу списка плагинов 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" при попытке активировать или деактивировать плагин, что вызывает недоумение у пользователей.

Почему это происходит?

  1. Независимость системы Heartbeat: Heartbeat API в WordPress отвечает за периодические AJAX-запросы, которые сообщают о состоянии сессии пользователя. Однако, система Heartbeat функционирует несколько изолированно от остального контента страниц. Она не привязана к логике конкретного контента и не знает, какие нонсы должны быть обновлены в зависимости от состояния пользователя. Это значит, что обновление сессии пользователя и обновление нонсов не синхронизированы.

  2. Отсутствие автоматического обновления нонсов: Даже если Heartbeat API инициирует обновления при проверке аутентификации (например, через событие heartbeat-tick.wp-auth-check), не все скрипты и плагины достаточно интеллектуальны, чтобы правильно реагировать на эти события. Это может быть следствием недостатка интеграции между Heartbeat API и пользовательскими интерфейсами, использующими нонсы.

  3. Логика обработки событий: Стандартное поведение Heartbeat не включает автоматическую отправку новых нонсов при входе пользователя в систему. Это также может зависеть от конкретного кода плагинов и тем, которые могут не учитывать необходимость обновления нонсов после повторной аутентификации.

Выводы и рекомендации

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

Рекомендации:

  • Обращение к документации: Разработчики должны внимательно изучить документацию WordPress о Heartbeat API и его использовании, чтобы интегрировать обновления нонсов в свои приложения.
  • Создание собственных триггеров для обновления: Если вы разрабатываете плагины или темы, подумайте о создании своих триггеров для обновления нонсов на основе событий аутентификации.
  • Сообщение о проблемах: Если вы сталкиваетесь с неочевидным поведением, не стесняйтесь сообщать об этом в WordPress Trac. Обратная связь от сообщества помогает улучшать систему и выявлять потенциальные баги.

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

Оцените материал
Добавить комментарий

Капча загружается...