在使用 WP Rest API 时,我有一个关于权限回调的问题。我已经使用 register_rest_route 注册了几个端点,只是想保护它们,以便在您未登录时无法访问内容。
add_action('rest_api_init', 'register_custom_endpoints');
function register_custom_endpoints(){
register_rest_route($base, $endpoint, [
'methods' => 'POST',
'callback' => function($request){
// Return JSON data
},
'permission_callback' => function($request){
// This always returns false
return is_user_logged_in();
},
]);
}
Run Code Online (Sandbox Code Playgroud)
我认为我的逻辑是正确的,但is_user_logged_in()总是返回 false,这意味着即使我实际登录我也永远不会得到数据。我得到的只是 404 响应:
{code: "rest_user_invalid_id", message: "Invalid user ID.", data: {status: 404}}
Run Code Online (Sandbox Code Playgroud)
我一直在网上搜索答案,我发现我需要随请求发送一个随机数。我试过将它作为正文数据和标题发送。如果我在正文中发送它,我无法验证它,因为它总是返回 false。如果我将它作为标头发送,我会得到与上述相同的 404 响应。
我在这里错过了什么,我做错了什么?
我最近遇到了同样的问题,事实证明您需要创建一个随机数并将其与请求标头一起传递。
您可以使用以下 php 代码创建适当的随机数。
$nonce = wp_create_nonce( 'wp_rest' );
Run Code Online (Sandbox Code Playgroud)
然后,您通过 header 与 HTTP 请求一起传递该随机数X-WP-Nonce。
假设您的客户端位于同一域(因此设置了 WordPress 的身份验证 cookie),您的会话应该可以通过 REST API 访问,因此功能current_user_can和is_user_logged_in工作方式与在 REST API 之外一样。