7

有没有办法可以限制对 WP REST API 的 url 调用的访问?我正在使用 WP REST API 创建可以通过 URL 访问的 AJAX 提要。它们的格式如下:http://example.com/wp-json/posts?type=post&filter[posts_per_page]=10

问题是任何人都可以添加/wp-json/posts?type=post&filter[posts_per_page]=10到我的 URL 的末尾并检索此信息的提要。当用户未登录 WordPress 执行以下操作时,我想将其关闭:

if ( !is_user_logged_in()) {
    // Turn off REST API feed
}

或者,我想添加某种需要添加以屏蔽 api 的身份验证。

我在网上找到了类似的东西,但我没有任何运气让它工作。我将它添加到自定义插件中。不幸的是,我在未登录时仍然可以访问提要。

add_action( 'init', function() {
    global $wp_post_types;
    $wp_post_types['post']->show_in_rest = is_user_logged_in();
}, 20 );

我担心没有办法在激活 API 和在前端发出 HTTP 请求之间建立联系。我想错了吗?有没有人遇到过这个问题?

谢谢!

4

3 回答 3

5

Wordpress 的问题和好处在于它提供了太多的灵活性,特别是当平台提供了一种干净的方法时:Require Authentication for all requests

您可以通过将 is_user_logged_in 检查添加到rest_authentication_errors过滤器来要求对所有 REST API 请求进行身份验证。

注意:传入的回调参数可以是 null、WP_Error 或布尔值。参数的类型表示认证的状态:

  • null:尚未执行身份验证检查,钩子回调可能会应用自定义身份验证逻辑。
  • boolean:表示执行了先前的身份验证方法检查。布尔值 true 表示请求已成功
    认证,布尔值 false 表示认证失败。
  • WP_Error:遇到某种错误。
add_filter( 'rest_authentication_errors', function( $result ) {
    // If a previous authentication check was applied,
    // pass that result along without modification.
    if ( true === $result || is_wp_error( $result ) ) {
        return $result;
    }

    // No authentication has been performed yet.
    // Return an error if user is not logged in.
    if ( ! is_user_logged_in() ) {
        return new WP_Error(
            'rest_not_logged_in',
            __( 'You are not currently logged in.' ),
            array( 'status' => 401 )
        );
    }

    // Our custom authentication check should have no effect
    // on logged-in requests
    return $result;
});

公平地说,这隐藏在常见问题中。

编辑:排除 jwt-auth

global $wp;

// No authentication has been performed yet.
// Return an error if user is not logged in and not trying to login.
if ( ! is_user_logged_in() && $wp->request !== 'wp-json/jwt-auth/v1/token' ) {
    return new WP_Error(
        'rest_not_logged_in',
        __( 'You are not currently logged in.' ),
        array( 'status' => 401 )
    );
}
于 2020-03-22T09:56:18.337 回答
4

这将为未登录的用户删除 WordPress 和 Woocommerce 的所有 REST API 端点:

function myplugin_removes_api_endpoints_for_not_logged_in() {

    if ( ! is_user_logged_in() ) {

        // Removes WordpPress endpoints:
        remove_action( 'rest_api_init', 'create_initial_rest_routes', 99 );

        // Removes Woocommerce endpoints
        if ( function_exists('WC') )
            remove_action( 'rest_api_init', array( WC()->api, 'register_rest_routes' ), 10 );
    }

} add_action('init', 'myplugin_removes_api_endpoints_for_not_logged_in');
于 2019-06-21T12:20:04.953 回答
2

这将阻止任何未登录的人使用整个 REST API:

function no_valid_user_no_rest($user) {
    if (!$user) {
        add_filter('rest_enabled', '__return_false');
        add_filter('rest_jsonp_enabled', '__return_false');
    }
    return $user;
}
add_filter('determine_current_user', 'no_valid_user_no_rest', 50);

标准警告,这只会关闭 REST,仅此而已。确保它有足够的优先级来排在其他determine_current_user过滤器之后。没有在多站点上测试。

如果您想按 URL 或其他因素进行过滤,您也可以将其他测试添加到条件中。

于 2016-03-16T19:35:41.987 回答