WordPress API 权限回调 - 检查用户是否已登录

Fil*_*pit 5 php wordpress

在使用 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 响应。

我在这里错过了什么,我做错了什么?

Mor*_*ith 9

我最近遇到了同样的问题,事实证明您需要创建一个随机数并将其与请求标头一起传递。

您可以使用以下 php 代码创建适当的随机数。

$nonce = wp_create_nonce( 'wp_rest' );
Run Code Online (Sandbox Code Playgroud)

然后,您通过 header 与 HTTP 请求一起传递该随机数X-WP-Nonce

假设您的客户端位于同一域(因此设置了 WordPress 的身份验证 cookie),您的会话应该可以通过 REST API 访问,因此功能current_user_canis_user_logged_in工作方式与在 REST API 之外一样。

  • 如果您给出完整的示例,您的答案会更有用 (14认同)
  • 如果不在同一个域怎么办? (2认同)