WordPress REST APIが使えない原因と解決方法|401・403エラーを切り分け

WordPress REST APIが使えないときの確認項目をまとめたアイキャッチ

AIエージェントを使うようになってから、WordPress関連の仕組みもいじってもらうことが多くなりました。

ただこの前新しいWordPressをインストールしたら401エラーが出て、REST APIが使えませんでした。

類似の記事は多いんですが、自分の備忘録として、確認した方が良さそうな部分をまとめておきます。

この記事で分かること
  • WordPress REST APIが使える状態か確認する方法
  • 401・403・404エラーの主な原因
  • アプリケーションパスワードやAuthorizationヘッダーの確認方法

WordPress REST APIとは?

WordPress REST APIは、WordPressの投稿などを、外部ツールやプログラムから読み書きできる仕組みです。

REST APIを使うと、別のアプリや自作ツール、AIツールなどからWordPressへ記事を投稿できます。

  • 投稿一覧を取得する
  • 新しい記事を作成する
  • 既存記事を更新する
  • カテゴリやタグを取得する
  • メディア画像をアップロードする

など。

REST API Handbook | Developer.WordPress.org
The WordPress REST API provides an interface for applications to interact with your WordPress site by sending and receiv…

最初にREST APIの状態を確認する

まずブラウザで、以下のURLを開いてみてください。

https://自分のドメイン/wp-json/

サイト情報やroutesなどが含まれるJSONが表示されれば、REST API自体にはアクセスできています。

404や403、セキュリティ画面などが表示される場合は、WordPressへ届く前の設定も含めて確認が必要です。

REST APIは開いているのに投稿だけ失敗する場合は、アプリケーションパスワードを使って認証状態を確認できます。

curl --user "ユーザー名:アプリケーションパスワード" https://自分のドメイン/wp-json/wp/v2/users/me

アプリケーションパスワードはWordPressのダッシュボードから、ユーザー一覧→編集→アプリケーションパスワードから発行可能です。

WordPressのアプリケーションパスワード追加画面

ここで自分のユーザー情報が返れば認証は通っています。

なお、実際のユーザー名やアプリケーションパスワードは、公開するコードや記事本文には載せないでください。

エラーごとの目安

エラー主に確認する部分
401 Unauthorizedユーザー名、アプリケーションパスワード、Authorizationヘッダー
403 Forbiddenユーザー権限、セキュリティプラグイン、WAF、アクセス制限
404 Not FoundURL、パーマリンク、REST API無効化設定

ただしWAFなどがWordPressへ届く前に止めている場合もあるので、エラー番号だけで原因を決めつけず、上から順番に切り分けるのが良いと思います。

WordPress REST APIが使えないときに考えられる原因

必要な情報が揃ってない

REST APIで投稿するには、基本的に以下の情報が必要です。

  • サイトURL
  • ユーザー名
  • アプリケーションパスワード

一つでも間違っていると、認証に失敗して投稿できません。

またアプリケーションパスワードはユーザーのプロフィール画面から発行できるもので、ログインパスワードとは異なります。

私は最初にここを間違えて認証に失敗しました。

WordPress 5.6以降ではアプリケーションパスワードが標準で用意されており、HTTPS経由のREST API認証に使えます。

.htaccessでAuthorizationヘッダーが渡っていない

REST APIで書き込みを行う場合、認証情報がWordPressまで届いている必要があります。

環境によってはAuthorizationヘッダーがPHP側に渡らず、認証エラーになるそうです。

あまり内部のことは分かっていないんですが、冒頭で書いた新しいWordPressのエラーはこれが原因でした。

私の環境では、.htaccessに以下の記述を追加して解決できています。

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

.htaccessは以下にあります。

レンタルサーバーのファイルマネージャーとかFTPソフトで修正可能です。

domain.com/public_html/.htaccess

編集前にバックアップを取り、追加する場合はWordPressが自動生成する「# BEGIN WordPress」より前へ記述してください。

「# BEGIN WordPress」から「# END WordPress」の間は、パーマリンク設定の保存などで上書きされる可能性があります。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

WordPressの公式FAQでは、Apache環境向けに以下の設定も案内されています。

<IfModule mod_setenvif>
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
</IfModule>

Nginx環境では.htaccessが使えないため、サーバー設定のFastCGI部分でAuthorizationヘッダーを渡す必要があるそうです。

プラグインのセキュリティ設定

セキュリティ系プラグインによって、REST APIへのアクセスが制限されている場合があります。

シンレンタルサーバーで自動インストールされるCloudSecure WP Securityだとこんな項目があります。

CloudSecure WP SecurityのREST API無効化設定

ここが有効化されてるとREST APIが使えないので、使うなら解除してみてください。

ただ、WordPressの管理画面でもREST APIを使う機能があるため、サイト全体のREST APIを無効にするより、原因になっている設定を絞って調整する方が安全です。

レンタルサーバー側のセキュリティ設定

レンタルサーバー側で、WordPress向けのセキュリティ設定やWAF設定があり、それが原因で使えなくなっている場合もあります。

・WordPress用セキュリティ設定

レンタルサーバーのREST APIアクセス制限設定

・WAF設定

レンタルサーバーのWAF設定項目

WordPressのREST API制限は関係ありそうですが、ここはONでも投稿できたのでよくわかりませんでした。

ONでも使えるなら基本的にはONのままの方が良いと思います。

WAFはREST API専用の機能ではありませんが、REST APIで送った記事本文も検査対象になります。

私はWAFの内部まで分かっていませんが、CloudSecure公式サポートでは、正常な投稿内容がXSSとして誤検知され、REST API経由の保存が止まった事例を確認できます。

シンプルWAF有効時に投稿保存できずJSONエラー(再発)
シンプルWAF有効時に投稿保存できずJSONエラー(再発) Resolved waon (@waon) 5 months, 2 weeks ago お世話になっております。CloudSecure WP Security を日頃より愛用してい…

要するに、記事本文の文字列が攻撃っぽく見えて、正常な投稿まで止められる場合があるということです。

どの設定が原因かは検知履歴を見ないと分からないため、投稿した時刻の「攻撃種別」「マッチした文字列」「検知したページのURL」を確認してみてください。

WAFを切って確認する場合も、原因の切り分けが終わったら元に戻すか、必要な通信だけを許可する設定が良さそうです。

使用しているユーザー権限が足りない

基本自分が管理者なら気にしなくて大丈夫です。

ただ複数で運営している場合、投稿権限がないと記事の作成や更新はできません。

アプリケーションパスワードは発行している前提で、権限ごとに操作可能な範囲は以下の通りです。

  • 管理者・編集者・投稿者:通常は記事の作成と公開が可能
  • 寄稿者:下書きやレビュー待ちの作成は可能。公開は不可。
  • 購読者:投稿権限なし

なのでもしチームで使ってて投稿できなかった場合は、管理者の人に権限を変えてもらう必要があります。

404の場合はパーマリンクを確認する

「/wp-json/」やREST APIのURLで404になる場合は、WordPressのパーマリンク設定や.htaccessの書き換え設定が崩れている可能性もあります。

管理画面の「設定」→「パーマリンク」を開き、現在の設定を確認して、そのまま「変更を保存」を押すとルールが再生成されます。

ただし.htaccessを手動編集している場合は、先にバックアップを取ってから試してください。

解決しない場合の確認順

原因が分からない場合は、以下の順番で確認すると切り分けやすいです。

  1. 「/wp-json/」でREST API自体へアクセスできるか確認する
  2. サイトURL・ユーザー名・アプリケーションパスワードを確認する
  3. 「/wp-json/wp/v2/users/me」で認証状態を確認する
  4. セキュリティプラグインのREST API制限を確認する
  5. レンタルサーバーのアクセス制限やWAFの履歴を確認する
  6. Authorizationヘッダーと.htaccess、Nginx設定を確認する

エラー番号だけで判断するより、どの段階まで通信できているかを順番に見る方が原因を見つけやすいと思います。

まとめ

以上REST APIが使えないときに確認した方がいいことを紹介しました。

参考になれば幸いです。

タイトルとURLをコピーしました