我们是否可以从PERMISSION_CALLBACK中访问REST请求参数,以通过返回FALSE来强制执行401?

时间:2019-07-17 作者:Muhammad Asif Mohtesham

从我迄今为止的尝试和测试来看,getter和setter在函数内部不起作用permission_callback.

另一种方法是从回调本身抛出自定义401。

是否可以使用permission_callback, 检查参数,并return false 而不是在callback 对于相同的功能return 401?

Update 1:

permission_callback => function($request) { $request->get_params(); } 不返回任何内容。我需要检查主体参数以允许或拒绝请求。

鉴于callback => function($request) { $request->get_params(); } 正确地返回参数。

Update 2:

在构造函数中,$this->init_api(); add_action(\'wp_enqueue_scripts\', array($this, \'api_wholesale_params\'));

在init\\u api中,

$this->set_namespace();

$this->set_route();

$this->api_params = array(
    \'methods\'             => WP_REST_Server::EDITABLE,
    // \'permission_callback\' => array($this, "verify_api_call"),
    \'callback\'            => array($this, "callback")
);

// Set up the API
add_action(\'rest_api_init\', function() {
    register_rest_route($this->namespace, $this->route, $this->api_params);
});


/**
 * Set property: namespace
 * 
 * Source: https://developer.wordpress.org/reference/functions/get_rest_url/
 */
function set_namespace() {
    return $this->namespace = "wholesale/v1/";
}

/**
 * Set property: route
 */
function set_route() {
    return $this->route = "authorise/";
}

/**
 * Localising the API parameters for use in JS
 */
function api_wholesale_params() {
    wp_register_script(\'api_wholesale\', null);
    wp_enqueue_script(\'api_wholesale\');

    wp_localize_script(\'api_wholesale\', \'apiWholesale\', array(
        \'namespace\'         => $this->namespace,
        \'route\'             => $this->route,
        "url"               => get_rest_url(null, $this->namespace.$this->route),
        "app_id"            => $this->manifest_data[\'app_id\'],
        "ver"               => $this->manifest_data[\'ver\'],
    ));
}

/**
 * Verification of the API call origin
 */
function verify_api_call(WP_REST_Request $req) {
    // $req->get_params(); // returns nothing

    if (array_key_exists(\'body\', $this->params) && array_key_exists(\'xsrf\', $this->params[\'body\'])) {
        // Validate the XSRF token, returns true or false
        $valid_xsrf = $this->verify_xsrf();

        // Returning false would trigger a 401
        return $valid_xsrf ? true : false;
    }
}

// API callback
function callback(WP_REST_Request $req) {
    // Unable to do this in permission_callback
    $this->params        = $req->get_params();

    // Want to do it part using permission_callback
    if ($this->verify_api_call()) {
        return rest_ensure_response($this->res);
    }
}
如你所见,我已经发表了评论permission_callback 因为$request->get_params() 不返回中的任何内容verify_api_call. 不过,我也可以这么说$request-get_params() 从…起callback.

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

我创建了一个简化的测试用例,它表明您想要做的事情是可以实现的:

add_action( 
    \'rest_api_init\',
    function() {
        register_rest_route(
            \'wpse/343039\',
            \'route\',
            [
                \'methods\' => [ \'POST\' ],
                \'permission_callback\' => function( WP_REST_Request $request ) {
                    if ( \'1\' == $request->get_param( \'param\' ) ) {
                        return true;
                    } else {
                        return false;
                    }
                },
                \'callback\' => function( WP_REST_Request $request ) {
                    return rest_ensure_response( \'1\' );
                },
            ]
        );
    }
);
使用此rest路由,如果我将POST请求发送到:

https://example.com/wp-json/wpse/343039/route
我将收到401 除非我通过,否则回复param 价值为1 在请求正文中:

{
    "param": 1
}
它也可以作为表单数据传递。如果我传递了那个参数,那么我看到1 在回应中,正如所料。

返回401 从REST端点返回falsepermission_callback 函数,并且正如我所演示的,只要您接受它作为参数,就可以完全访问回调中的请求。

相关推荐

我可以在纯固定链接格式上使用REST-API吗?

最近,我所有的REST-API请求都突然返回404错误,每个请求(无论是自定义端点还是内置的)。然后我想这是因为permalink的结构。/wp-json/ 在普通permalink下无法访问,因为目前根本没有可用的重定向规则。在这种情况下是否可以使用REST端点?自定义和内置。