WordPress JSON API限制到特定的域

时间:2014-06-20 作者:user1655746

我已经安装并激活了Wordpress JSON API(http://wordpress.org/plugins/json-api) 在我的自我托管WP站点中。现在,我的网站内容通过JSON格式的API向全世界开放。

但是,我想将此JSON API的访问限制为仅来自特定域的请求。尽管有人知道我的站点启用了JSON API和URL端点,但他们应该看到“拒绝访问”,除非请求来自特定的allowd域。

如何在WP中实现此限制?

提前谢谢。

3 个回复
SO网友:Sisir

More reliable 将允许使用特定IP而不是域REMOTE_ADDR 标题。您可以使用HTTP_REFERRER 标题,但it is not reliable.

您可以通过使用rest_authentication_errors 滤器

add_filter( \'rest_authentication_errors\', \'wpse150207_filter_incoming_connections\' );

function wpse150207_filter_incoming_connections( $errors ){

    $allowed_ips = array( \'127.0.0.1\' );
    $request_server = $_SERVER[\'REMOTE_ADDR\'];

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

    return $errors; 

}
rest api将在给定ip阵列以外的其他ip上生成403错误。

Note: 该解决方案适用于WPv4.4.2 + Rest APIv2.0-beta12.

SO网友:zipzit

所提供的软件具有利用WordPress Nonce系统的工具。正如现在所写的,nonce仅用于通过API调用验证post的提交。好消息是,代码组织得很好,可以很容易地自定义代码,以要求所有API请求都提交nonce(或其他安全令牌系统)。

注意:nonce是一个“使用一次的数字”,用于保护URL和表单不被滥用。参考号:http://codex.wordpress.org/WordPress_Nonces nonce在托管站点上生成,然后发送给用户,以便用户可以将其包含在API请求中以验证其权限。一个nonce只适用于两次验证检查,如果未使用的将在24小时内过期。有一个问题是,任何人都可能“要求”临时密码,也许你必须恢复到密码/id系统。

== Method: get_nonce ==
Returns a WordPress nonce value, required to call some data manipulation methods.
= Required arguments =
* `controller` - the JSON API controller for the method you will use the nonce for
* `method` - the method you wish to call (currently `create_post` is the only method that requires a nonce)
= Response =
    {
      "status": "ok",
      "controller": "posts",
      "method": "create_post",
      "nonce": "cefe01efd4"
    }  

== Method: create_post ==
Creates a new post.
= Required argument =
* `nonce` - available from the `get_nonce` method (call with vars `controller=posts` and `method=create_post`)
= Optional arguments =
* `status` - sets the post status ("draft" or "publish"), default is "draft"
* `title` - the post title
* `content` - the post content (etc...)
为了让客户端应用程序通过API获取数据(例如获取“关于”页面),我希望重新编写的代码以这种方式运行:

<?php
require_once \'HTTP/Client.php\';
$http = new HTTP_Client();
$http->get(\'http://wordpress.test/?json=core.get_page&slug=about&dev=1&nonce=cefe01efd4\');
$response = $http->currentResponse();
$response = json_decode($response[\'body\']);

echo "Response status: $response->status\\n";
echo "Page title: {$response->page->title}\\n";
?>
--EXPECT--
Response status: ok
Page title: About Us -- This is an awesome website.

SO网友:Jürgen Fink

对于那些在2021读到这篇文章的人来说@Sisir

WordPress: 版本5.7.2PHP: 版本7.4

你有没有试过Permission Callback ?

根据WP的以下2个nice来源REST API Handbook:
REST API Handbook / Extending the REST API / Routes and Endpoints
REST API Handbook / Extending the REST API / Adding Custom Endpoints


/**
 * Permission Callback function:
 * \'ypp\' is the Prefix I chose (ypp = Your Private Page)
 */

function ypp_get_private_data_permissions_check() {
    /**
     * Restrict endpoint to allowed IPs (white listing approach)
     */
    $allowed_ips = array( \'127.0.0.1\' );
    $request_server = $_SERVER[\'REMOTE_ADDR\'];

    if( ! in_array( $request_server, $allowed_ips ) )
        return new WP_Error( \'rest_forbidden\', esc_html__( \'Access denied from your IP address.\', \'my-text-domain\' ), array( \'status\' => 401 ) );

    return true;
};

add_action(\'rest_api_init\', function() {
    /**
    * Register here your custom routes for your CRUD functions
    */
    register_rest_route( \'your_private_page/v1\', \'/data\', array(
        array(
            \'methods\'  => WP_REST_Server::READABLE,
            \'callback\' => \'get_your_data\', // <-- your main callback function
            // Always allow GET, for example
            \'permission_callback\' => \'__return_true\' // <-- to leave it open
            ),
        array(
            \'methods\'  => WP_REST_Server::CREATABLE,
            \'callback\' => \'insert_your_data\', // <-- your main callback function
            // Here we register our permissions callback. The callback is fired before the main callback to check if the current user can access the endpoint.
            \'permission_callback\' => \'ypp_get_private_data_permissions_check\',
        ),
        array(
            \'methods\'  => WP_REST_Server::EDITABLE,
            \'callback\' => \'update_your_data\', // <-- your main callback function
            // Here we register our permissions callback. The callback is fired before the main callback to check if the current user can access the endpoint.
            \'permission_callback\' => \'ypp_get_private_data_permissions_check\',
        ),
    ));
});
Note:
不再需要插件。这个WP REST API 已合并到WordPress核心。

结束

相关推荐

带身份验证的.htaccess怎么会突然出现或改变呢?

当我试图将一条评论标记为垃圾邮件时,我看到了一个基本的htaccess登录名。我无法登录,然后我想起我没有基本的登录:我的.htaccess 在wp-admin 文件夹does是允许的IP的白名单。在查看文件时,我发现我现在在我的wp-admin/.htaccess 设置基本身份验证(由于某种原因,用户/密码文件位于/dev/null)我的根访问文件中还有额外的行(/.htaccess) 包含另一个基本身份验证行,指向根目录中的密码文件。这两个文件都是5日创建/修改的,但不是我自己创建/修改的</密