验证WP REST API GET请求

时间:2017-05-15 05:20:13

标签: wordpress rest api

最近我在我的网站上安装了WP REST API,它运行良好。但问题是,数据是通过开放URL向公众提供的,不需要身份验证。例如,对wp-json / wp / v2 / posts的get请求会向用户列出所有帖子详细信息。

有没有办法验证对WordPress REST API的GET请求?我不希望匿名用户可以使用这些数据。即使是基本的身份验证也适合我!

4 个答案:

答案 0 :(得分:0)

您只能为使用此插件的已登录用户限制WP REST API https://wordpress.org/plugins/disable-json-api/

或者如果您不想使用插件,可以在主题中添加此代码

if( ! is_user_logged_in() ) {
add_filter( 'rest_authentication_errors', 'ultimatewoo_disable_rest_api' );
function disable_rest_api( $access ) {
    return new WP_Error( 'rest_disabled', __( 'The REST API on this site has been disabled.' ), array( 'status' => rest_authorization_required_code() ) );
}}

答案 1 :(得分:0)

您需要在/wp-includes/default-filters.php

中添加一个过滤器

找到此部分:

// REST API filters.
add_action( 'xmlrpc_rsd_apis',            'rest_output_rsd' );
add_action( 'wp_head',                    'rest_output_link_wp_head', 10, 0 );
add_action( 'template_redirect',          'rest_output_link_header', 11, 0 );
add_action( 'auth_cookie_malformed',      'rest_cookie_collect_status' );
add_action( 'auth_cookie_expired',        'rest_cookie_collect_status' );
add_action( 'auth_cookie_bad_username',   'rest_cookie_collect_status' );
add_action( 'auth_cookie_bad_hash',       'rest_cookie_collect_status' );
add_action( 'auth_cookie_valid',          'rest_cookie_collect_status' );
add_filter( 'rest_authentication_errors', 'rest_cookie_check_errors', 100 );

然后添加一个新的过滤器,如下所示:

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;
    });

此解决方案是mentioned on the WordPress developer resources site,但是它们没有明确告诉您将过滤器添加到何处。

进行此更改之后,未经身份验证的用户尝试连接REST API时,您应该看到以下消息:

{"code":"rest_not_logged_in","message":"You are not currently logged in.","data":{"status":401}}

答案 2 :(得分:0)

可以通过ip限制

add_filter( 'rest_authentication_errors', 'filter_incoming_connections' );

function filter_incoming_connections( $errors ){

  $allowedAddress = array( '127.0.0.1' );
  $requestServer = $_SERVER['REMOTE_ADDR'];

  if( ! in_array( $requestServer, $allowedAddress ) )
    return new WP_Error( 'forbidden_access', 'Access denied', array( 'status' => 403 ) );

  return $errors;
}

$ allowedAddress添加授权的IP

答案 3 :(得分:-1)

您可以尝试使用此代码更改该代码。

add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! empty( $result ) ) {
    return $result;
}
if ( ! is_user_logged_in() ) {
    return new WP_Error( 'restx_logged_out', 'Sorry, you must be logged in to make a request.', array( 'status' => 401 ) );
}
return $result;
});