web-dev-qa-db-ja.com

への外部アクセスを無効にする REST APIエンドポイント

私はWP REST AP​​Iで遊んでいて、ホームページからフォームが送信されたときに新しいユーザーを作成するためのルートを設定しました。エンドポイントを設定する方法は次のとおりです。

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;
}

私が疑問に思っているのは、この経路への外部からのアクセスをどのように防ぐのが最善かということです。ホームページ上の実際のフォームのデータだけがこのエンドポイントにデータを投稿できるようにしたいのです。

コールバックでOriginをチェックしようとしましたが、これが正しい方法であるかどうかわかりません。

function test_add_user() {
   // only allow request from the same Origin
   if (get_http_Origin() != home_url()) {
     exit;
   }

   ...
}

私はおそらくその行に沿ってナンスか何かを使うことについて考えますか?

おそらく、私はまた、フォームを送信しているユーザーがログインしていないので、Cookieベースの認証などを使用できないことにも言及する必要があります。

4
Cyclonecode

この目的でWP REST AP​​Iを使用しないことをお勧めします。これは、リモートアプリ/サービスではなくホームページで使用されているためです。
REST AP​​Iは、既に公開されているデータへのアクセスをリモート開発者に許可することになっています。
公開データを提供するのではなく、ホームページからユーザーを登録するため、Ajaxが適切な代替手段になる可能性があります。
公式WordPress REST AP​​Iから ハンドブック

WordPress REST AP​​IはWordPressデータ型のAPIエンドポイントを提供し、開発者がJSON(JavaScript Object Notation)を送受信することでサイトとやり取りできるようにしますリモートオブジェクト。

ただし、これが唯一のユースケースではありません。

この目的のためにAjaxを使用することをお勧めします。

  • Ajaxリクエストにnonceを含めます。

  • wp_ajax_nopriv アクションでAjax要求ハンドラーをフックします。

これにより、ユーザーがログインしていないことを確認し、nonceはフォームがWordPressによって生成されたことを確認します。
Ajaxユーザー登録、プレミアムおよび無料で利用可能なプラグインが既にあります。WordPressプラグインリポジトリは良いスタートです。
この代替アプローチが役立つことを願っています。

1
devkabiir