阻止用户访问 REST API 端点,同时仍从中获取数据
Block users from REST API endpoint while still grabbing data from it
我创建了 2 个 REST API 端点来存储 CPT 数据及其自定义字段:
存档数据:xyz.com/wp-json/wl/v2/businesses
单一业务数据:xyz.com/wp-json/wl/v2/businesses/<ID>
这两个端点都已注册权限回调;
register_rest_route( 'wl/v2', '/businesses', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'wl_businesses_posts',
'permission_callback' => '__return_true'
));
这是一个商业目录网站,其中每个 'business' 客户都有一个通用仪表板 (xyz.com/dashboard
),并且此仪表板页面从 [=37] 中提取 'business' 的数据=]单一业务数据 REST API 上面的端点并填写页面上的输入字段。
还有一个可供未登录访问者访问的页面 ( xyz.com/business1
),该页面对所有企业都是通用的,并且是一个只读页面,访问者可以在其中查看该企业的详细信息。此页面也从上面提到的 单一业务数据 REST API 端点提取数据。
我想要完成的是除了管理员之外没有人能够窥视 存档数据 或 单一业务数据 直接显示高 JSON 数据的端点,以避免窃取在该站点注册的所有企业的信息。但与此同时,我希望这些端点可以通过 wp_remote_retrieve_body( wp_remote_get( $url ) );
代码访问以填充 仪表板 和 单一业务信息 页数。
我试过这段代码,但它显然也阻止了页面代码发出的在页面中提取和填充数据的请求。
add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! empty( $result ) ) {
return $result;
}
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_not_logged_in', 'You are not currently logged in.', array( 'status' => 401 ) );
}
return $result;
});
我不一定是在找代码,只是在寻找如何解决这个问题的方向。
----------------------------更新-------- ------------------
:
就像我说的,因为它是一个商业目录,即使是非登录用户也应该看到 CPT 的存档页面和单个商业页面。我最近了解了 register_rest_route
参数中的 'permission callbacks',那么我如何在 wp_remote_get 函数中传递自定义 'key' 参数并在权限回调中接收和验证它?
好的,我已经设法通过在请求中传递一个参数来保护我的端点,并且只有当它在其余端点的权限回调中匹配时,才会检索数据:
$userData = wp_remote_retrieve_body( wp_remote_get( $url, array(
'body' => array(
'param' => '1'
),
'sslverify' => false,
) ) );
并且在 register_rest_route
:
'permission_callback' => function( WP_REST_Request $request ) {
if ( '1' == $request->get_param( 'param' ) ) {
return true;
} else {
return false;
}
}
我很高兴我不必为此使用插件:D
我创建了 2 个 REST API 端点来存储 CPT 数据及其自定义字段:
存档数据:xyz.com/wp-json/wl/v2/businesses
单一业务数据:xyz.com/wp-json/wl/v2/businesses/<ID>
这两个端点都已注册权限回调;
register_rest_route( 'wl/v2', '/businesses', array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'wl_businesses_posts',
'permission_callback' => '__return_true'
));
这是一个商业目录网站,其中每个 'business' 客户都有一个通用仪表板 (xyz.com/dashboard
),并且此仪表板页面从 [=37] 中提取 'business' 的数据=]单一业务数据 REST API 上面的端点并填写页面上的输入字段。
还有一个可供未登录访问者访问的页面 ( xyz.com/business1
),该页面对所有企业都是通用的,并且是一个只读页面,访问者可以在其中查看该企业的详细信息。此页面也从上面提到的 单一业务数据 REST API 端点提取数据。
我想要完成的是除了管理员之外没有人能够窥视 存档数据 或 单一业务数据 直接显示高 JSON 数据的端点,以避免窃取在该站点注册的所有企业的信息。但与此同时,我希望这些端点可以通过 wp_remote_retrieve_body( wp_remote_get( $url ) );
代码访问以填充 仪表板 和 单一业务信息 页数。
我试过这段代码,但它显然也阻止了页面代码发出的在页面中提取和填充数据的请求。
add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! empty( $result ) ) {
return $result;
}
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_not_logged_in', 'You are not currently logged in.', array( 'status' => 401 ) );
}
return $result;
});
我不一定是在找代码,只是在寻找如何解决这个问题的方向。
----------------------------更新-------- ------------------
:
就像我说的,因为它是一个商业目录,即使是非登录用户也应该看到 CPT 的存档页面和单个商业页面。我最近了解了 register_rest_route
参数中的 'permission callbacks',那么我如何在 wp_remote_get 函数中传递自定义 'key' 参数并在权限回调中接收和验证它?
好的,我已经设法通过在请求中传递一个参数来保护我的端点,并且只有当它在其余端点的权限回调中匹配时,才会检索数据:
$userData = wp_remote_retrieve_body( wp_remote_get( $url, array(
'body' => array(
'param' => '1'
),
'sslverify' => false,
) ) );
并且在 register_rest_route
:
'permission_callback' => function( WP_REST_Request $request ) {
if ( '1' == $request->get_param( 'param' ) ) {
return true;
} else {
return false;
}
}
我很高兴我不必为此使用插件:D