Je joue avec l'API WP REST et j'ai configuré un itinéraire permettant de créer un nouvel utilisateur lorsqu'un formulaire est soumis à partir de la page d'accueil. Voici comment j'ai configuré le noeud final:
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;
}
Ce que je me demande, c'est comment empêcher au mieux l'accès externe à cette route? Je veux seulement que les données du formulaire sur la page d'accueil puissent être en mesure de poster des données sur ce terminal.
J'ai essayé de vérifier l'origine dans le rappel, mais je ne suis pas sûr que ce soit la bonne façon de procéder:
function test_add_user() {
// only allow request from the same Origin
if (get_http_Origin() != home_url()) {
exit;
}
...
}
Je pensais peut-être utiliser des nonces ou quelque chose du genre?
Je devrais peut-être aussi mentionner que l'utilisateur qui soumet le formulaire n'est pas connecté, donc je ne peux pas utiliser d'authentification basée sur un cookie ou similaire.
Je suggérerais de ne pas utiliser l'API WP REST à cette fin, car elle est utilisée sur la page d'accueil et non sur une application/service distante.
L'API REST est censée accorder l'accès à toute donnée déjà disponible au public à un développeur distant.
Étant donné que vous ne fournissez pas de données publiques mais que vous enregistrez des utilisateurs à partir de la page d'accueil, Ajax peut constituer une bonne alternative.
D'après WordPress officiel REST API Manuel
WordPress REST L'API fournit des points de terminaison d'API pour les types de données WordPress permettant aux développeurs d'interagir avec les sites remote en envoyant et en recevant des objets JSON (JavaScript Object Notation).
Cependant, ce n'est pas son seul cas d'utilisation.
Je suggérerais d'utiliser Ajax à cette fin.
Incluez le nonce avec la requête Ajax.
Accrochez le gestionnaire de requêtes Ajax avec wp_ajax_nopriv action.
Cela garantit que l'utilisateur n'est pas connecté et que le nonce s'assure que le formulaire a été généré par WordPress.
Il existe déjà des plugins pour l’enregistrement d’utilisateur Ajax, premium et gratuits, le référentiel de plugins WordPress sera un bon début.
J'espère que cette approche alternative aidera.