WordPress 4.0 Cookie Authentication, чтобы избежать ошибки nonce при публикации публикации и страницы

Файлы cookie теперь привязаны к внутренним сеансам в WordPress 4.0 .

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

Старый метод (используемый в многочисленных плагинах) заключался в использовании wp_set_auth_cookie($user_id,0,0) но это больше не будет работать. Пользователь регистрируется на сайте, но пользователь с правильными ролями не может публиковать сообщение или страницу. Вместо этого возвращается ошибка nonce («Вы уверены, что хотите это сделать?)

Это новый код (среди многих других попыток), который я пробовал, но все равно получаю ту же самую ошибку nonce.

 wp_set_auth_cookie( $user_id, 0, 0 ); $manager = WP_Session_Tokens::get_instance( $user_id ); $token = $manager->create( $expiration ); 

Чтобы преодолеть эту проблему, и временно, wp_verify_nonce установлен всегда, чтобы вернуться 1. Однако я хотел бы знать, как создать токен в наборе файлов cookie.

Кто-нибудь еще преодолел эту проблему? Так как это новый код для WP, есть ли у кого-нибудь предложения?

ОБНОВЛЕНИЕ. Проведя несколько часов этим вечером, снова посмотрев на эту проблему … Я понял, что Zend_Debug::dump($_COOKIE); может быть полезно. Разумеется, строка в двух файлах cookie не соответствует.

Строка для этих двух не соответствует в hmac.

'Wordpress_logged_in_4ed466320671a355e05b9bf211271dd6'

'Wordpress_4ed466320671a355e05b9bf211271dd6'

Интересно, если я делаю Zend_Debug::dump($cookie_elements['hmac']); строка возвращает значение wordpress_4 …., а не wordpress_logged_in.

Несоответствие приводит к ошибке nonce.

Solutions Collecting From Web of "WordPress 4.0 Cookie Authentication, чтобы избежать ошибки nonce при публикации публикации и страницы"

На самом деле, только эта проверка исправила эту проблему.

 if(!is_user_logged_in()) { wp_set_current_user($userid); if(wp_validate_auth_cookie()==FALSE) { wp_set_auth_cookie($userid, true, false); } } 

похоже, исправил эту проблему.

@ здесь ваше предлагаемое решение не сработало для меня и просто перенаправило меня на страницу входа при попытке войти в панель инструментов

Исправлено: после добавления раннего теста, чтобы избежать повторного входа в систему уже зарегистрированного пользователя, я смог полностью удалить всю обработку сеанса и wp_set_current_user cookie и полагаться на один вызов wp_set_current_user

Удачи!


Это решает проблему до сих пор и использует новый класс WP_Session_Tokens для обновления сеанса и токена текущего пользователя.

Предыдущий код остался встроенным, но прокомментирован.

Спасибо за указатели @LPH, высоко оценил.

 $username = 'username'; // Edge case handles when plugin is activated and still logged in as old user. // wp_clear_auth_cookie(); // Setup new user. $user = wp_set_current_user($user_id, $username); // wp_set_auth_cookie($user_id, 1); // Required for WP 4.0 // https://core.trac.wordpress.org/ticket/20276 // $sessionManager = WP_Session_Tokens::get_instance( $user_id ); // $token = $sessionManager->create(time() + (1 * 24 * 60 * 60)); // $session = $sessionManager->get($token); // $sessionManager->update($token,$session); 

Аутентификация была выполнена путем создания функции wp_validate_auth_cookie и ее вызова.

 if ( ! function_exists( 'wp_validate_auth_cookie' ) ) : function wp_validate_auth_cookie( $cookie = '', $scheme = '' ) { if ( XenWord::getVisitor()->getUserId() != 0 ) { return XenWord::getVisitor()->getUserId(); } return false; } endif; 

Затем вызовите эту замену в разделе входа вашего кода.

  $current_user = get_userdata( $user_id ); wp_set_current_user( $user_id ); wp_validate_auth_cookie($cookie = '', $scheme = ''); // Check to determine if adding XF users to WP database XenWord_XF_Users::check_options(); return $current_user; 

Теперь кеширующие плагины работают снова.