wp_create_nonce () в REST API делает user-> ID zero

У меня проблемы с wp_create_nonce() и wp_verify_nonce() .

Корнем моей проблемы является как способ создания nonce, так и место, где я генерирую nonces.

Если посмотреть на коды wp_create_nonce() и wp_verify_nonce() , я вижу, что nonces – это значение хэша, созданное из нескольких факторов, включая $uid , который является user id of current user .

 $ user = wp_get_current_user ();
 $ uid = (int) $ user-> ID;
 если (! $ uid) {
     / ** Этот фильтр задокументирован в wp-includes / pluggable.php * /
    $ uid = apply_filters ('nonce_user_logged_out', $ uid, $ action);

 }
 $ token = wp_get_session_token ();
 $ i = wp_nonce_tick ();
 return substr (wp_hash ($ i. '|'. $ action. '|'. $ uid. '|'. $ token, 'nonce'), -12, 10); 

Я создаю nonce в REST API и проверяю nonce на обычной странице. Тем не менее, я также обнаружил, что $uid становится 0 в REST API (не знаю почему, но где-то я видел это и сам тестировал. Да, внутри REST нет идентификатора пользователя). Таким образом, $uid в моей функции REST и $uid на моей странице становятся разными.

[1] Я создаю _wpnonce в REST API. Ниже приведен псевдокод для моей функции в REST.

 add_action( 'rest_api_init', function() { register_rest_route( 'view/', '/customers/', array( 'methods' => 'POST', 'callback' => 'fnc_view_customer_in_table_format' )); }); if( !function_exists( 'fnc_view_customer_in_table_format' ) ) { function fnc_view_customer_in_table_format(WP_REST_Request $request ) { //*** Code omitted on purpose *** $data .= '<form action="'. get_the_permalink( $post->ID ) .'" id="_form-view" name="_form-view" method="post">'; $data .= '<input type="hidden" id="_wpnonce" name="_wpnonce" value="'. wp_create_nonce( 'view_post-'. $post->ID ) .'" />'; $data .= '<input type="hidden" id="_post_id" name="_post_id" value="'. $post->ID. '" />'; $data .= '<input type="submit" class="btn btn-sm btn-link" value="'. get_the_title( $post->ID ) .'">'; $data .= '</form>'; //*** Code omitted on purpose *** $result = array( 'msg' => $data, 'error' => false ); } 

[2] Выше $data возвращается как ответ и отражается на обычной странице. И я проверяю nonce здесь. Это обычная страница WordPress.

 <?php get_header(); $wpnonce = $_REQUEST['_wpnonce']; $post_id = $_REQUEST['_post_id']; if( !wp_verify_nonce( $wpnonce, 'view_post-'. $post_id ) ) { die( 'Security check' ); } ?> //*** Omitted: HTML Codes *** <?php get_footer(); 

Итак, я полагаю, что единственным решением является разрешение WordPress REST current_user. Как я могу достичь этого, или я думаю неправильно?

** EDIT ** В качестве обходного пути я изменил свой процесс wp_verify_nonce как wp_verify_nonce ниже.

 // nonce is created in REST API, which doesn't have UID // In order to replicate the same, set UID to 0 here $uid = (int) wp_get_current_user()->ID; wp_set_current_user(0); // Nonce check if( !wp_verify_nonce( $wpnonce, 'view_post-'. $post_id ) ) { die( 'Security check' ); } // Now get the current user back in place wp_set_current_user( $uid ); 

В любом случае, это выглядит не красиво. Какая была бы лучшая практика для решения моей проблемы?

Solutions Collecting From Web of "wp_create_nonce () в REST API делает user-> ID zero"