如何使用Wordpress Rest Api获取当前登录用户?

2022-08-30 11:52:05

我尝试添加自定义请求。

add_action('rest_api_init', function () {
    register_rest_route( 'custom', '/login', array(
        'methods' => 'GET',
        'callback' => function(WP_REST_Request $request) {
            return wp_get_current_user();
        }
    ));
});

但它总是返回ID = 0的用户;我也试过这个:

add_action('rest_api_init', function () {
    register_rest_route( 'custom', '/login', array(
        'methods' => 'GET',
        'callback' => function(WP_REST_Request $request) {
            return is_user_logged_in();
        }
    ));
});

它总是返回 false。但用户肯定已登录。

我添加了我的自定义登录名

add_action('rest_api_init', function () {
    register_rest_route( 'custom', '/login', array(
        'methods' => 'POST',
        'callback' => function(WP_REST_Request $request) {
            $nonce = wp_create_nonce("wp_rest");
            $user = wp_signon(array('user_login' => $_POST['username'],
                'user_password' => $_POST['password'], "rememberme" => true), false);
            if (is_wp_error($user)) {
                return $user;
            }

            //do_action( 'wp_login', "capad" );
            //$user['isloggedin'] = is_user_logged_in();
            return array('user' => $user,
                'nonce' => $nonce);
        }
    ));
});

我添加“X-WP-Nonce”作为http请求的标头

现在每个请求都会输出:{"code":"rest_cookie_invalid_nonce","message":"Cookie nonce is invalid","data":{"status":403}}


答案 1

身份验证章节的 REST API 手册中:

Cookie身份验证是WordPress中包含的基本身份验证方法。当您登录到仪表板时,这将为您正确设置cookie,因此插件和主题开发人员只需要有一个登录用户。

但是,REST API包含一种称为nonces的技术,以避免CSRF问题。这可以防止其他网站在没有明确意图的情况下强迫您执行操作。这需要对 API 进行稍微特殊的处理。

对于使用内置 Javascript API 的开发人员,这是自动为您处理的。这是将 API 用于插件和主题的推荐方法。自定义数据模型可以扩展 wp.api.models.Base,以确保为任何自定义请求正确发送此数据模型。

对于发出手动Ajax请求的开发人员,需要在每个请求中传递nonce。API 使用 nonce,并将操作设置为 。然后,可以通过数据参数(POST 数据或在 GET 请求的查询中)或通过标头将这些参数传递给 API。wp_rest_wpnonceX-WP-Nonce

下面是一个 GET 示例:

https://example.tld/wp-json/wp/v2/users/me?_wpnonce=9467a0bf9c

或者在您的案例中:

https://example.tld/wp-json/custom/login/?_wpnonce=9463a0bf9c

其中,随机数是从以下位置创建的

wp_create_nonce( 'wp_rest' );

因此,在测试自定义终结点时,很可能忘记了 nonce 部分

希望它有帮助!


答案 2

我花了两天时间寻找一种简单的方法,而不添加插件。

函数中的第一个.php定义 api 的位置

//enqueue the script which will use the api
function api_callings_scripts() {
    wp_enqueue_script('score-script', get_template_directory_uri() . '/js/ScoreSaving.js', ['jquery'], NULL, TRUE);
    // Pass nonce to JS.
    wp_localize_script('score-script', 'ScoreSettings', [
      'nonce' => wp_create_nonce('wp_rest'),
    ]);
}
add_action( 'wp_enqueue_scripts', 'api_callings_scripts' ); 

然后你的脚本Ajax调用云是这样的

jQuery.ajax({
      type: "POST",
      url: "/wp-json/score/update",
      data: {"var1":"value1"},
      beforeSend: function(xhr) {
        xhr.setRequestHeader('X-WP-Nonce', ScoreSettings.nonce);
      },
    success: 
        function( data ) {
          console.log( data );
        }
    });

现在,您可以在 API 代码中使用。get_current_user_id()


推荐