Вопрос: Отключить внешний доступ к конечной точке 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 или подобное.

Ответы и комментарии:

Вы действительно можете использовать одноразовые номера. Прочитайте здесь и в документах.
Создан 11-02-2017 12:36 montrealist

Да, я тоже думал об этом. Причина, по которой я хотел использовать настоящий REST API, заключалась в том, чтобы просто узнать больше об этом, и я знаю, что его не следует использовать для этой цели, но я все еще задавался вопросом, есть ли способ справиться с моей конкретной ситуацией. Я также читал, что REST API быстрее, чем использование ajax-admin.php. Кроме того, гораздо проще зарегистрировать группу конечных точек, чем подключаться к каждому обратному вызову ajax.
Создан 11-02-2017 09:38 Cyclonecode

@ Cyclonecode Я согласен, но мой ответ был конкретным для этой ситуации, рассмотрим сценарий: пользователи посещают ваш сайт -> Регистрируются -> и входят в систему -> все происходит через Ajax, обеспечивая гораздо лучший пользовательский опыт. Принимая во внимание, что REST API на самом деле не имеет никакого значения с точки зрения пользователей. Так зачем использовать его для регистрации? НО если вам удастся создать приложение / службу, которая позволит пользователям зарегистрироваться в вашем блоге WordPress, REST API - это то, что вам нужно. REST API не является альтернативой Ajax, однако в этом случае Ajax будет более выгодным.
Создан 11-02-2017 10:00 devkabiir

Должен быть способ - они переделывают весь wp-admin с помощью REST API
Создан 08-03-2017 04:05 themerlinproject

На мой взгляд, WordPress Rest API все еще не готов к такому варианту использования. Буквально в прошлом месяце (Sucuri) [blog.sucuri.net/2017/02/… опубликовал этот пост в блоге, использование Rest API для подобных вещей открывает злоумышленникам только новый способ скомпрометировать ваш сайт.
Создан 08-03-2017 04:16 devkabiir

Я бы предложил не использовать WP REST API для этой цели, так как он используется на домашней странице, а не в каком-либо удаленном приложении / сервисе.

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


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

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

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

Это гарантирует, что пользователь не вошел в систему, а одноразовый номер гарантирует, что форма была сгенерирована WordPress.
Есть плагины, уже доступные для регистрации пользователей Ajax, премиум и бесплатные, репозиторий плагинов WordPress будет хорошим началом.
Я надеюсь, что этот альтернативный подход помогает.
Создан 11-02-2017 07:55 devkabiir547113