web-dev-qa-db-ja.com

Wordpress REST API、キャッシュからの期限切れのナンスにより403が禁止される

私のwordpressサイトは、Cloudflareに似たキャッシュサービスであるAkamaiの背後にあります。

次のAPI呼び出しを行います。

GET /wp-json/mytheme/v1/get-posts?post_type=videos

これは、 '@ wordpress/api-fetch'のapiFetchを使用して行われます。

そして、これをリクエストヘッダーに自動的に含めます

X-WP-Nonce: 12323423

これは、ナンスの有効期限が切れる24時間後まで正常に機能します。キャッシュは引き続き有効期限切れのナンスを引き続き使用し、403禁止およびページの破損を引き起こします。

Nonceヘッダーなしで同じリクエストを実行すると、完全に正常に動作します。

Wordpressに、GETリクエストのみのノンスを無効または削除する方法はありますか?

または、リクエストをインターセプトしてX-WP-Nonceヘッダーを取り除きますか?

これは、wordpressフロントエンドから行われているリクエストを作成するための私のコードです。

apiFetch({
     path: '/wp-json/mytheme/v1/get-posts?post_type=videos',
     parse: false,
});
1
elMarquis

認証ドキュメントに基づく here -リクエストごとにnonceキーを渡す必要があります。

そのため、ナンスキーが有効期間を超えてフロントエンドでキャッシュされている場合は、認証ステップの前にAPIリクエストにフックし、キャッシュされたナンスキーを有効なものに置き換える必要があります。

WordPressは_rest_send_nocache_headers_フィルターを提供し、( ここを参照 )にフックできます。これにより、認証前にアクションを実行できます。

_$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;
}
_

上記の例では、is_user_logged_in()関数をパラメーターとして渡してフィルターにフックしています。これはtrueまたはfalseを返します。

次に、クエリでは、ユーザーがログインしていない場合、ユーザーは管理者ではありません。これはGETリクエストであり、無効なnonceキーを有効なnonceキーに切り替えます。

4
thomas_jones