Intereting Posts
Как применить фильтр «retrieve_password_message»? Масонство Добавить сообщения WordPress с помощью singleMode Крюк, который срабатывает при сохранении настроек администратора Поиск фактических функций, добавленных в крючки и фильтры Список рассылки регистрируется без плагина Как отключить the_excerpt из одного сообщения Миграция пользователей WordPress в Disqus Как вызвать функцию только один раз (глобальная область переменных) Назначить категорию по умолчанию Как запустить JS, PHP и т. Д. Внутри WP-сообщения? Параметр Ajax и WP_Query / tax_query Запрос сначала отсортировать список по мета-ключу (если он существует) и показать оставшиеся сообщения без мета-ключа, упорядоченного по заголовку Как добавить кнопку на страницу сообщений пользовательского типа сообщения Пользовательская колонка таблицы сортировка по таксономическому запросу Сохранить цикл в массив

Обработка генерации nonce в процессе регистрации AJAX

В настоящее время я работаю над многоступенчатой ​​системой регистрации, основанной на новом API WordPress Rest, и у меня возникла проблема, связанная с генерацией и проверкой nonce.

Мой первый шаг заключается в том, чтобы спросить пользователя из формы внешнего интерфейса для получения важной информации (имя – имя – адрес электронной почты). Второй вопрос – попросить его предоставить дополнительную информацию о метаданных. Затем третий попросит у него пароль и подтверждение пароля.

В процессе есть 3 разных запроса HTTP-сообщения, все обрабатывается в AJAX. Стратегия, которую я применял, заключается в том, чтобы генерировать nonce на стороне сервера, если первый POST в порядке, и вернуть его в ответ JSON. Вот код для создания пользователя на первом шаге:

$user_id = wp_insert_user( $userdata ) ; $user = new \WP_User($user_id); if (!empty( $user ) && $user instanceof \WP_User) { $user->add_role( 'subscriber' ); } // Autologin after registration wp_set_current_user($user_id); wp_set_auth_cookie($user_id); // Storing the regitration event for the user $this->saveLoginEvent( $user_id ); $data = array( 'user_id' => $user_id, 'nonce' => wp_create_nonce( 'wp_rest' ), 'message' => 'user_created' ); 

Пользователь правильно создан и зарегистрирован. Но использование этого nonce во время дополнительных шагов считается недействительным (всегда получая 403). Мой код для отмены nonce следующий:

 /** * authenticate_call - Default permission callback used to validate that the call is coming from our frontend * * @return {WP_nonce} The state of the nonce, if it is verified or not */ public function authenticate_call() { if ( isset( $_REQUEST['_wpnonce'] ) ) { $nonce = $_REQUEST['_wpnonce']; } elseif ( isset( $_SERVER['HTTP_X_WP_NONCE'] ) ) { $nonce = $_SERVER['HTTP_X_WP_NONCE']; } if ( empty( $nonce ) || null === $nonce ) { // No nonce at all, so act as if it's an unauthenticated request. return new \WP_Error( 'rest_cookie_no_nonce', __( 'Nonce is invalid' ), array( 'status' => 403 ) ); } $result = wp_verify_nonce( $nonce, 'wp_rest' ); if ( ! $result ) { return new \WP_Error( 'rest_cookie_invalid_nonce', __( 'Cookie nonce is invalid' ), array( 'status' => 403 ) ); } return true; } 

Ошибка, которую я получаю, является второй: rest_cookie_invalid_nonce . Nonce передается как параметр URL, такой как POST www/api/url?_wpnonce=a30e88f0bd . Есть идеи ? Вы знаете что-нибудь о невозможности иметь бэкэнд, генерирующий nonce, и возвращать его в интерфейс? Должен ли я создать его на интерфейсе, используя метод, о котором я пока не знаю. Если это помогает, я использую Timber и Twig в качестве компонентов архитектуры frontend.

Заранее спасибо,

Solutions Collecting From Web of "Обработка генерации nonce в процессе регистрации AJAX"

Если кто-то задушил его, правильным решением будет использование wp_set_auth_cookie указав второй параметр, являющийся файлом logged_in, который теперь дает мне следующий код:

 wp_set_current_user($user_id); if ( wp_validate_auth_cookie( '', 'logged_in' ) != $user_id ) { wp_set_auth_cookie( $user_id ); } 

И добавьте действие, как предлагается в этом потоке: Расширьте сеанс WordPress (4.x) и nonce, чтобы обновить текущий файл cookie, который был включен в систему, без необходимости обновления страницы.

Это было сложно, и бездокументально. Кто-нибудь еще это пробовал?

Спасибо за ваше внимание, в любом случае,