Intereting Posts

Отключить внешний доступ к конечной точке API REST

Я играю с 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; } ... } 

Я, хотя, возможно, используя нонцы или что-то в этом направлении?

Возможно, я также должен упомянуть, что пользователь, отправляющий форму, не регистрируется, поэтому я не могу использовать аутентификацию на основе cookie или аналогичную.

Solutions Collecting From Web of "Отключить внешний доступ к конечной точке API REST"

Я бы предложил не использовать WP REST API для этой цели, поскольку он используется на домашней странице, а не в удаленном приложении / службе.
API REST должен предоставлять доступ к любым уже общедоступным данным удаленному разработчику.
Поскольку вы не предоставляете публичные данные, а регистрируете пользователей с домашней страницы, Ajax может быть хорошей альтернативой.
Из официального руководства API REST WordPress

WordPress REST API предоставляет конечные точки API для типов данных WordPress, которые позволяют разработчикам удаленно взаимодействовать с сайтами, отправляя и получая объекты JSON (Object Object Notation).

Однако это не единственный случай использования.

Я бы предложил использовать Ajax для этой цели.

  • Включите nonce с запросом Ajax.

  • Подцепите обработчик запроса Ajax с помощью действия wp_ajax_nopriv .

Это гарантирует, что пользователь не войдет в систему, а nonce гарантирует, что форма была создана WordPress.
Есть плагины, уже доступные для регистрации пользователей Ajax, премиум и бесплатно, репозиторий плагинов WordPress станет хорошим началом.
Я надеюсь, что этот альтернативный подход поможет.