Intereting Posts
Пользовательская постоянная ссылка с двумя параметрами Настройка отображаемого изображения сообщения из встроенного видео YouTube Удалить nav_menus из customizer с помощью темы Последствия изменения wordpress.com, связанные с Jetpack Можно ли скрыть пользовательские пользовательские настройки пользовательского интерфейса / меню из определенных ролей пользователей? Добавить Добавить в корзину через Поиск Как удалить ранее установленную настройку? Подключиться к установочной электронной почте Пользователь Loop 1 случайным образом Ограничить пользовательский интерфейс для администратора? Сортировка сообщений на основе нескольких настраиваемых полей Как создать эскизы с фиксированной шириной, поэтому все они будут иметь одинаковую ширину? Как создать несколько новых объектов wpdb? domain.com?p=POSTID permalinks не работает с пользовательскими типами сообщений Почему моя кнопка предварительного просмотра работает правильно?

Обработка генерации 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, который был включен в систему, без необходимости обновления страницы.

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

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