随机数和AJAX请求REST API和验证

时间:2020-11-02 作者:Rob

十多年来我第一次使用WordPress。。。使用木材进行MVC。Vue位于前端,axios用于ajax帖子。都托管在同一个域上,因此我可以使用cookie进行身份验证。

我正在使用axios,并将nonce设置为本地变量,我在Vue中提取该变量,并在通过axios发布时使用该变量设置标题。

我注册了许多自定义API路由,例如:

add_action( \'rest_api_init\', function () {
    register_rest_route( \'rw-user/v1\', \'/log-in\', array(
        \'methods\' => \'POST\',
        \'callback\' => \'ajax_login\',
    ));
    register_rest_route(\'rw-user/v1\',\'/log-out\', array(
        \'methods\' => \'POST\',
        "callback" => \'ajax_logout\'
    ));
     // .... truncated ....
});
我很困惑,因为我可以在有无停顿的情况下达到这些终点(因为我是英国人,所以我觉得很有趣)。

如果我传递nonce头,它将检查nonce并在确定时运行函数,如果不确定则拒绝。如果我don\'t 传递nonce头,它不会检查nonce,但仍会运行函数。。。

我在文档中读到:

https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/

“参考资料”;请注意,无需验证nonce在自定义端点内是否有效。这将在“中自动为您完成”

因此,如果端点已经在进行验证,那么如果不存在nonce,它肯定会失败吗?

这是否意味着rest端点不会自动检查nonce的有效性,我应该自己检查函数中的有效性?

此外,一些页面大量使用AJAX与这些自定义端点进行交互。对于每个AJAX请求,nonce都会变得无效,从而中断将来的AJAX请求(我使用POST)。

我假设我需要在接收AJAX请求的函数中生成一个新的nonce,并将这个新的nonce返回到浏览器,以便我可以将新的nonce发布到下一个AJAX请求的头部。

$new_nonce = wp_create_nonce( \'new_nonce\' );
wp_send_json_success(array(\'nonce\'=>$new_nonce ));
我可以在控制台中看到返回的新nonce。。。我在下一个请求中使用它来更新标头,但是nonce失败了,尽管它是新的?

如果您能就如何正确使用NONCES给出任何建议,我们将不胜感激。谢谢

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

要限制对REST API端点的访问,可以使用permission_callback 这样的参数:

register_rest_route( \'rw-user/v1\', \'/log-out\', array(
    \'methods\'             => \'POST\',
    \'callback\'            => \'ajax_logout\',
    \'permission_callback\' => function () {
        return current_user_can( \'read\' );
    },
) );
这将要求当前用户登录WordPress和REST API,以便访问example.com/wp-json/rw-user/v1/log-out.

因此,如果端点已经在进行验证,那么如果不存在nonce,它肯定会失败吗?

对然而

如果我don\'t 传递nonce头,它不会检查nonce,但仍会运行函数。。。

这是因为一旦权限回调返回true — 请注意,在WordPress 5.5及更高版本中,您应该始终设置回调-您可以使用__return_true 允许对端点的所有访问。例如。

register_rest_route( \'rw-user/v1\', \'/log-in\', array(
    \'methods\'             => \'POST\',
    \'callback\'            => \'ajax_login\',
    \'permission_callback\' => \'__return_true\',
) );
我可以在控制台中看到返回的新nonce。。。我在下一个请求中使用它来更新标头,但是nonce失败了,尽管它是新的?

这可能是因为您没有发送正确的nonce。

验证当前用户的nonce操作是wp_rest, 所以你应该使用wp_create_nonce( \'wp_rest\' ) 生成(新)nonce时。

并确保通过X-WP-Nonce 标题(首选)或_wpnonce 数据参数(不错,但不太可靠)。

因此无需验证;,这只适用于wp_rest nonce(即默认的基于cookie的身份验证)。所有其他nonce(如果有)都需要手动验证。