十多年来我第一次使用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给出任何建议,我们将不胜感激。谢谢
最合适的回答,由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(如果有)都需要手动验证。