Mon site wordpress se trouve derrière Akamai, qui est un service de mise en cache similaire à Cloudflare.
J'effectue l'appel d'API suivant:
GET /wp-json/mytheme/v1/get-posts?post_type=videos
Cela se fait en utilisant apiFetch de '@ wordpress/api-fetch';
Et cela inclut automatiquement cela dans l'en-tête de la demande
X-WP-Nonce: 12323423
Cela fonctionne bien jusqu'à 24 heures plus tard, lorsque le nonce expire. Le cache continue à utiliser le Nonce expiré, ce qui entraîne une interdiction 403 et une page cassée.
Si je fais la même demande sans en-tête Nonce, cela fonctionne parfaitement bien.
Existe-t-il un moyen dans Wordpress pour désactiver ou supprimer les requêtes Nonce for GET uniquement?
Ou même supprimer l'en-tête X-WP-Nonce en interceptant la demande?
C'est mon code pour faire la demande qui est faite à partir du frontend wordpress.
apiFetch({
path: '/wp-json/mytheme/v1/get-posts?post_type=videos',
parse: false,
});
Sur la base de la documentation d'authentification ici - une clé nonce doit être transmise à chaque demande.
Donc, si la clé nonce est mise en cache sur le frontend au-delà de sa durée de vie, vous devrez vous connecter à la demande d'API avant l'étape d'authentification et remplacer la clé nonce mise en cache par une clé valide.
WordPress fournit un filtre rest_send_nocache_headers
Auquel nous pouvons nous connecter ( voir ici ). Cela nous permet d'effectuer une action avant l'authentification.
$send_no_cache_headers = apply_filters('rest_send_nocache_headers', is_user_logged_in());
if (!$send_no_cache_headers && !is_admin() && $_SERVER['REQUEST_METHOD'] == 'GET') {
$nonce = wp_create_nonce('wp_rest');
$_SERVER['HTTP_X_WP_NONCE'] = $nonce;
}
Dans l'exemple ci-dessus, nous nous accrochons au filtre en passant la fonction is_user_logged_in()
comme paramètre. Cela retournera vrai ou faux.
Ensuite, dans notre requête, si l'utilisateur n'est pas connecté, il ne fait pas partie de l'administrateur et, c'est une demande GET
, nous procédons à la commutation de la clé nonce non valide par une clé valide.