我正在使用WP REST API,并设置了一个路由,用于在从主页提交表单时创建新用户。以下是如何设置端点:
add_action(\'init\', \'test_init\');
function test_init() {
// register the route
add_action(\'rest_api_init\', function () {
register_rest_route( \'test/api/v1\', \'/user/add\', array(
\'methods\' => \'POST\',
\'callback\' => \'test_add_user\',
));
});
}
function test_add_user() {
// make sure all data is available
if (!isset($_POST[\'firstname\'],
$_POST[\'surname\'],
$_POST[\'email\'],
$_POST[\'password\'])) {
exit;
}
// check so the user not already exists
if (username_exists($_POST[\'firstname\'])) {
exit;
}
// create a new user
$user = array(
\'user_pass\' => $_POST[\'password\'],
\'user_login\' => $_POST[\'firstname\'],
\'user_email\' => $_POST[\'email\'],
\'first_name\' => $_POST[\'firstname\'],
\'last_name\' => $_POST[\'surname\'],
\'role\' => \'author\'
);
$user_id = wp_insert_user($user);
// return the id of the created user
echo json_encode(array(\'id\' => $user_id));
exit;
}
我想知道的是如何最好地防止外部访问此路线?我只希望来自主页上实际表单的数据能够将数据发布到此端点。
我试图在回调中检查原点,但我不确定这是否是正确的方法:
function test_add_user() {
// only allow request from the same origin
if (get_http_origin() != home_url()) {
exit;
}
...
}
我在想是否可以使用nonces或类似的东西?
也许我还应该提到,提交表单的用户没有登录,因此我无法使用基于cookie的身份验证或类似验证。
最合适的回答,由SO网友:user6552940 整理而成
我建议不要为此使用WP REST API,因为它是在主页上使用的,而不是任何远程应用程序/服务
REST API应该授予远程开发人员对任何已公开可用数据的访问权限
因为您不提供任何公共数据,而是从主页注册用户,所以Ajax可能是一个不错的选择
来自官方WordPress REST APIHandbook
WordPress REST API为WordPress数据类型提供API端点,允许开发人员通过发送和接收JSON(JavaScript对象表示法)对象与站点进行远程交互。
然而,这并不是它的唯一用例
我建议为此使用Ajax
在Ajax请求中包含nonce。
用钩子钩住Ajax请求处理程序wp_ajax_nopriv 行动
这确保用户未登录,并且nonce确保表单是由WordPress生成的<已有用于Ajax用户注册的插件,高级免费,WordPress插件库将是一个良好的开端<我希望这种替代方法能有所帮助。