web-dev-qa-db-fra.com

Wordpress REST, Nonce expiré du cache entraîne 403 interdit)

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,
});
1
elMarquis

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.

4
thomas_jones