Wordpress:使用 AJAX 调用的 REST API 进行 Cookie 检查失败

问题描述 投票:0回答:1

我创建了一个 REST API,在页面加载时使用 AJAX 调用该 API 来获取帖子元数据。为了确保安全,我实现了“permission_callback”来限制只有管理员用户才能访问。我的代码的相关部分如下:

// register rest api route
add_action('rest_api_init', 'register_api_endpoints');
function register_api_endpoints() {
    register_rest_route('api/v1/', '/getdata/', array(
        'methods' => 'GET',
        'callback' => 'rest_api_callback',
        'args' => array(
            'id' => array(
                'required' => true,
            ),
        ),
        'permission_callback' => 'check_permission',
    ));
}

//check user permission callback
function check_permission() {
    return current_user_can('administrator');
}
function enqueue_custom_scripts() {
    wp_enqueue_script('jquery');

    $inline_nonce = wp_create_nonce('my_inline_nonce');
    wp_localize_script('jquery', 'my_ajax_object', array('ajax_nonce' => $inline_nonce));

}

// Function to enqueue scripts with nonce
add_action('wp_enqueue_scripts', 'enqueue_custom_scripts');

// Hook the ajax functionality to the wp_footer action
add_action('wp_footer', 'get_ajax_html');

function get_ajax_html() {
    $html = '<script>
    jQuery.ajax({
            url: "/wp-json/api/v1/getdata?id=1",
            method: "GET",
             headers: {
            "X-WP-Nonce": my_ajax_object.ajax_nonce,
        },
            contentType: "application/json; charset=utf-8",
            dataType: "json",
          })
          </script>';

    echo $html;
}

// rest api callback
function rest_api_callback($data) {
    //get current user id
    $user_id = get_current_user_id();

    $post_id = sanitize_text_field($data['id']);
    $result = get_post_meta($post_id);
    if (!empty($result)) {
        return rest_ensure_response($result);
    } else {
        return new WP_Error('empty', 'No results found', array('status' => 404));
    }
}

“但是,我在 AJAX 调用过程中遇到以下错误:

{
    "code": "rest_cookie_invalid_nonce",
    "message": "Cookie check failed",
    "data": {
        "status": 403
    }
}

我提供了一张屏幕截图来说明该问题。

当我注释掉“rest_api_init”回调中的“permission_callback”和 AJAX 调用中的“X-WP-Nonce”时,我发现用户 ID 在“rest_api_callback()”函数中也显示为 0。 API 响应在这种情况下有效。但是,我的目标是强制执行权限,仅允许管理员用户在登录用户的页面加载期间调用 API。我正在寻求有关实施必要权限的指导,同时仍确保 API 响应正常工作。

php ajax wordpress wordpress-rest-api
1个回答
0
投票

答案在文档中(https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/):

对于发出手动 Ajax 请求的开发人员,需要将随机数设置为 每个请求都通过。 API 使用随机数并将操作设置为 wp_休息

...

如果未提供随机数 API 将设置 当前用户变为0,将请求变成未经身份验证的 请求,即使您已登录 WordPress。

你唯一应该做的就是改变

$inline_nonce = wp_create_nonce('my_inline_nonce');

进入

$inline_nonce = wp_create_nonce('wp_rest');
© www.soinside.com 2019 - 2024. All rights reserved.