J'ai du mal à faire travailler les nonces avec mon formulaire de soumission ajax.
Tout d'abord, je crée un nonce et le passe à mon script enregistré. Je l'enverrai plus tard à ajax-handler, qui contient tous les champs de mon formulaire:
wp_localize_script( 'roll_script', 'Roll', array(
'postRollNonce' => wp_create_nonce('nonce-roll')));
Dans mon gestionnaire ajax-response, je vérifie le nonce, fais mon travail et essaie de créer un nouveau nonce à renvoyer à js, pour le soumettre plus tard:
function on_ajax_roll(){
if (!wp_verify_nonce($_POST['postRollNonce'], 'nonce-roll' )) die ('No allowed!');
// nonce is valid! do some stuff...
$r = array('postRollNonce' => wp_create_nonce('nonce-roll'));
$response = json_encode($r);
header( "Content-Type: application/json" );
echo $response;
die();
}
... mais revenons à ma question, le nouveau nonce est exactement le même que l'ancien! Puisque nonce est censé changer avec le temps, pourquoi un second appel à wp_create_nonce renvoie la même chaîne?
Par défaut, la durée de vie d'un nonce est d'un jour. Le nonce est généré en concaténant une variable représentant le jour actuel, l'ID utilisateur et le nom de l'action, puis en hachant la chaîne résultante.
Si vous souhaitez que la valeur de nonce change plus fréquemment, vous pouvez filtrer la valeur 'nonce_life'. Cette fonction, par exemple, obligera les heures de jeu à changer toutes les heures:
function nonce_hourly() {
return 3600;
}
add_filter( 'nonce_life', 'nonce_hourly' );
Mais cela ne ressemble pas exactement à ce que vous essayez de faire. Vous aurez peut-être plus de chance de générer le type de non-ponctuel que vous souhaitez en utilisant un nom différent pour la valeur "action" du nonce, qui sera vraiment unique pour l'action spécifique que vous tentez d'effectuer. Il semble que vous utilisiez "nonce-roll" comme nom d'action pour des actions distinctes que vous souhaitez pouvoir vérifier séparément - vous pouvez peut-être utiliser un nom d'action plus spécifique pour chaque action que vous essayez d'exécuter et autoriser.