WordPress の REST API を用いて投稿を行おうとしたときに、401 エラーが出ていた。エラー本文は以下のような感じ。
{"code":"rest_cannot_create","message":"このユーザーとして投稿を編集する権限がありません。","data":{"status":401}}
原因が複数あり時間がかかったが、どうにか解決したのでメモ代わりに残しておこうと思う。
PHP を CGI で動かすと Authorization ヘッダーが使えない場合がある
Google 検索とサーバーの情報を確認したところ、どうやら PHP を CGI で動かすと Authorization ヘッダーが消えてしまう場合があるらしい。
Authorization ヘッダーを環境変数で扱うために CGIPassAuth を有効にする #PHP - Qiita
Basic Authorization Header Missing · WordPress/application-passwords Wiki · GitHub
自分が利用しているレンタルサーバーでは PHP が CGI で動作していたので、上記 Web ページにあるように .htacess を編集した。
# BEGIN WordPress
RewriteEngine On
# 以下の行を追記
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
これで問題なく動く・・・と思いきやまた同様のエラーメッセージが出る。
HTTP で REST API にアクセスすると 401 エラーが出る場合がある
.htaccess を編集してもまだ 401 エラーが出続けた。
改めてスクリプト編集して確認すると、 REST API へ HTTP でアクセスすると 401 エラーが返ってくるようだった。REST API のエンドポイントを http から https へ変更すると問題なく投稿できた。
開発環境ではならなかったので、本番環境で利用しているセキュリティプラグイン(レンタルサーバーの WP 簡単インストール的な機能を利用すると勝手に入ってくる)が http でのアクセスを拒否しているのではないか、と考えていたがソースコードを確認してもそれらしき文言は確認できず。
とりあえず原因は不明だが https に変更したら 401 エラーは消え正常に動作した。
コメント