我创建了一个REST API,在页面加载时使用AJAX调用它来获取post Meta数据。为了确保安全性,我实现了一个“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
}
}
型
我包括一个屏幕截图来说明这个问题。
x1c 0d1x的数据
我注意到,当我注解掉"rest_API_init“回调中的”permission_callback“和AJAX调用中的”X-WP-Nonce“时," rest_API_callback()”函数中的用户ID也显示为0。API响应在这种情况下有效。然而,我的目标是强制执行权限,只允许管理员用户在登录用户的页面加载期间调用API。我正在寻求有关实现必要权限的指导,同时仍确保API响应正确工作。
1条答案
按热度按时间axkjgtzd1#
答案在文档(https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/)中:
对于进行手动Ajax请求的开发人员,需要在每个请求中传递nonce。API使用nonce,action设置为 wp_rest。
...
如果没有提供随机数*,API会将当前用户设置为0**,将请求转换为未经身份验证的请求,即使您已登录WordPress。
你唯一要做的就是改变
字符串
成
型