REST APIを無効にできますか?

REST APIを無効にするべきではありません。そうすると、APIがアクティブであることに依存するWordPress管理機能が壊れてしまいます。ただし、フィルターを使用してAPIの消費者が認証されることを要求することができ、これにより匿名の外部アクセスを効果的に防ぐことができます。詳細については以下を参照してください。

すべてのリクエストに認証を要求する

すべてのREST APIリクエストに認証を要求するには、rest_authentication_errorsフィルターにis_user_logged_inチェックを追加します。

注意:受信するコールバックパラメータは、nullWP_Error、またはブール値のいずれかである可能性があります。パラメータのタイプは認証の状態を示します:

  • null:まだ認証チェックが行われておらず、フックコールバックはカスタム認証ロジックを適用する可能性があります。
  • ブール値:以前の認証方法チェックが行われたことを示します。ブール値trueはリクエストが正常に認証されたことを示し、ブール値falseは認証が失敗したことを示します。
  • WP_Error:何らかのエラーが発生しました。
  1. add_filter( 'rest_authentication_errors', function( $result ) {
  2. // If a previous authentication check was applied,
  3. // pass that result along without modification.
  4. if ( true === $result || is_wp_error( $result ) ) {
  5. return $result;
  6. }
  7. // No authentication has been performed yet.
  8. // Return an error if user is not logged in.
  9. if ( ! is_user_logged_in() ) {
  10. return new WP_Error(
  11. 'rest_not_logged_in',
  12. __( 'You are not currently logged in.' ),
  13. array( 'status' => 401 )
  14. );
  15. }
  16. // Our custom authentication check should have no effect
  17. // on logged-in requests
  18. return $result;
  19. });

プラグイン内でPHPからAPIリクエストを行うことはできますか?

はい、できます!他のWordPressコード内でAPIリクエストを行うには、https://developer.wordpress.org/reference/functions/rest_do_request/を使用します:

  1. $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
  2. // Set one or more request query parameters
  3. $request->set_param( 'per_page', 20 );
  4. $response = rest_do_request( $request );

_embedパラメータを内部リクエストで使用するにはどうすればよいですか?

リクエストオブジェクトに_embedパラメータを設定しても機能しません。

  1. $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
  2. $request->set_param( '_embed', 1 );
  3. $response = rest_do_request( $request );

代わりに、WP_REST_Server::response_to_data関数を手動で呼び出します。

  1. $request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
  2. $response = rest_do_request( $request );
  3. $data = rest_get_server()->response_to_data( $response, true );
  4. var_dump( $data['_embedded'] );

?filter=クエリパラメータはどうなりましたか?

REST APIがWordPressコアに統合されたとき、?filterクエリパラメータは将来の互換性とメンテナンスの問題を防ぐために削除されました。?filterクエリパラメータを使用してAPIに任意のWP_Query引数を渡す機能は、REST APIプロジェクトの初期段階で必要でしたが、ほとんどのAPIレスポンスフィルタリング機能は、?categories=?slug=?per_page=のようなより堅牢なクエリパラメータによって置き換えられました。

可能な限りファーストパーティのクエリパラメータを使用するべきです。ただし、https://github.com/wp-api/rest-filterプラグインは、必要に応じてAPIリクエストに任意の?filter値を渡す機能を復元します。

クエリパラメータが機能していません

もし?page=2?_embedのようなクエリパラメータが効果を持たない場合、サーバーがそれらを正しく検出するように構成されていない可能性があります。Nginxを使用してウェブサイトを提供している場合は、サイト構成内にtry_files行を探してください。それが次のように見える場合:

  1. try_files $uri $uri/ /index.php$args;

これを次のように変更します:

  1. try_files $uri $uri/ /index.php$is_args$args;
  1. <a name="why-is-authentication-not-working"></a>
  2. ## なぜ認証が機能しないのですか?
  3. 認証ヘッダーを送信しているのにリクエストが受け入れられない場合、CGI環境を使用していると、ウェブサーバーがヘッダーを削除している可能性があります。これを解決するために、以下の適切な構成を追加してみてください。
  4. <a name="apache"></a>
  5. ### Apache
  6. 構成ファイルまたは.htaccessに次の内容を追加します:
  7. ``````bash
  8. <IfModule mod_setenvif>
  9. SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
  10. </IfModule>
  11. `

Nginx

サーバー構成のfastcgiセクションに次の内容を追加します:

  1. fastcgi_pass_header Authorization;

なぜREST APIは受信したOriginヘッダーを検証しないのですか?これにより、私のサイトがCSRF攻撃にさらされるのですか?

クロスオリジンリソースシェアリング(CORS)は、ウェブサイトがどのオリジン(外部サイト)に自サイトのデータへのアクセスを許可するかを制御できるメカニズムです。CORSは、クロスサイトリクエストフォージェリ(CSRF)として知られる特定のタイプの攻撃を防ぎます。ただし、WordPressにはノンスを使用した既存のCSRF保護メカニズムがあります。CORS制限を厳しくすると、一部の認証方法が妨げられるため、WordPress REST APIはCORSの代わりにCSRF保護のためにノンスを使用します。

WordPress REST APIは受信リクエストのOriginヘッダーを検証しないため、公開REST APIエンドポイントは任意のサイトからアクセス可能です。

これは意図的な設計決定ですが、未知のオリジンからのアクセスを防ぎたい場合は、デフォルトのrest_send_cors_headers関数rest_pre_serve_requestフィルターフックから解除し、その同じフィルターに自分の関数をフックして、より厳格なCORSヘッダーを指定することができます。