私は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;
}
私が疑問に思っているのは、この経路への外部からのアクセスをどのように防ぐのが最善かということです。ホームページ上の実際のフォームのデータだけがこのエンドポイントにデータを投稿できるようにしたいのです。
コールバックでOriginをチェックしようとしましたが、これが正しい方法であるかどうかわかりません。
function test_add_user() {
// only allow request from the same Origin
if (get_http_Origin() != home_url()) {
exit;
}
...
}
私はおそらくその行に沿ってナンスか何かを使うことについて考えますか?
おそらく、私はまた、フォームを送信しているユーザーがログインしていないので、Cookieベースの認証などを使用できないことにも言及する必要があります。
この目的でWP REST APIを使用しないことをお勧めします。これは、リモートアプリ/サービスではなくホームページで使用されているためです。
REST APIは、既に公開されているデータへのアクセスをリモート開発者に許可することになっています。
公開データを提供するのではなく、ホームページからユーザーを登録するため、Ajaxが適切な代替手段になる可能性があります。
公式WordPress REST APIから ハンドブック
WordPress REST APIはWordPressデータ型のAPIエンドポイントを提供し、開発者がJSON(JavaScript Object Notation)を送受信することでサイトとやり取りできるようにしますリモートオブジェクト。
ただし、これが唯一のユースケースではありません。
この目的のためにAjaxを使用することをお勧めします。
Ajaxリクエストにnonceを含めます。
wp_ajax_nopriv アクションでAjax要求ハンドラーをフックします。
これにより、ユーザーがログインしていないことを確認し、nonceはフォームがWordPressによって生成されたことを確認します。
Ajaxユーザー登録、プレミアムおよび無料で利用可能なプラグインが既にあります。WordPressプラグインリポジトリは良いスタートです。
この代替アプローチが役立つことを願っています。