Wordpress の API で BASIC 認証を使う

WordpressAPI を使用するにあたり、いくつかの機能では認証が必要になります。
認証の方法にはいくつかありますが、高いセキュリティが求められていない場合は簡単な方法にしたいところです。
サポートされている認証の1つに BASIC認証(Basic Authentication) がありますので、これを使用する際のポイントをまとめておきたいと思います。

プラグインの導入が必要

BASIC認証を使用するためには、プラグインの導入が必要です。といっても大仰なプラグインを導入する必要はなく、 https://github.com/WP-API/Basic-Auth から basic-auth.php をダウンロードして、wp-content/plugins ディレクトリに配置するだけです。
配置したあと、有効化するのを忘れないようにしましょう。

.htaccess の修正が必要な場合がある

ここがハマるポイントだと思います。
上記のプラグインでは、$SERVER['PHP_AUTH_USER'] と $SERVER['PHP_AUTH_PW'] を参照して、BASIC認証のユーザとパスワードを取得しています。
しかし Apache を採用しているレンタルサーバ等では、デフォルトではこれらの値を取得することができない場合があります。
その場合は .htaccess に以下のような設定を追加する必要があります。

RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

ポイントは、Wordpress が自動的に生成するリライトルールの前に書くという点です。
これを Wordpress が自動的に生成するリライトルールの後に書いた場合、正常に動作しません。


これで、BASIC認証による API の認証ができるはずです。
どうしても 403 Forbidden になってしまう場合は、以下を確認するとよいでしょう。

  • クライアント側からちゃんと BASIC 認証のヘッダが送信されているか
  • Wordpress 側で PHP_AUTH_USER / PHP_AUTH_PW が取得できているか

WAF や SSL などの目的のために設置されたリバースプロキシによって、うまく情報が渡っていないケースも考えられます。

動作検証などで「何でもいいからとにかく動かしたいんだ!」という場合には、basic-auth.php をいじってしまうという手もあります。
結局は、渡ってきたユーザ/パスワードで Wordpress の内部的な認証をかけているだけなので、basic-auth.php の以下の部分で $username と $password に任意のユーザとパスワードを与えれば、認証は通るようになります。

$user = wp_authenticate( $username, $password );