PHPでBasic認証する方法とエラー対策

ページごと、あるいはディレクトリごとにベーシック認証をかけたい時に、.htaccessでの設定よりもPHPでやった方が簡単だと思います。

以下のやり方で、PHPでのベーシック認証と、私が体験したエラーと対策を記録します。

認証画面の表示と入力の受取り、そして照合

記述する手順は以下の通りです。
もしユーザーとパスの入力が、指定の文字でない場合、認証画面を表示させ、
指定の文字であった場合、htmlの内容を表示させる。

ソースコードにすると下記のようになります。

if($_SERVER['PHP_AUTH_USER']!=="user" || $_SERVER['PHP_AUTH_PW']!=="password"){
header("www-Authenticate: Basic realm=\"This Page is Member Only\"");
header("HTTP/1.0 401 Unauthorized");
}elseif($_SERVER['PHP_AUTH_USER']=="user" && $_SERVER['PHP_AUTH_PW']=="password"){
//ここにHTML
}

分解していくとこのようになります。

if($_SERVER['PHP_AUTH_USER']!=="user" || $_SERVER['PHP_AUTH_PW']!=="password"){

$_SERVER[‘PHP_AUTH_USER’] は認証画面のID部分の入力
$_SERVER[‘PHP_AUTH_PW’]は認証画面のパスワード部分の入力です。
これらのどちらかが、指定の文字でない場合、次のコードで認証画面を出します。

header("www-Authenticate: Basic realm=\"This Page is Member Only\"");
header("HTTP/1.0 401 Unauthorized");

このheader関数で認証画面を出すことができます。realm属性の中が、認証画面上のメッセージテキストになります。realm属性は””で囲む必要がありますが、header関数の””と重複してエラーになるため、\でエスケープしています。

elseif($_SERVER['PHP_AUTH_USER']=="user" && $_SERVER['PHP_AUTH_PW']=="password")

あとは、IDとパスワードが“どちらも”指定の文字と適合していれば、HTMLを表示させるだけです。
ポイントは、エラーのときはIDどパスの“どちらかが”間違っていれば表示させないため、||(あるいは)でIDとパスの認証を区切ります。
適合のときは、&&(なおかつ)でIDとパス両方適合の場合のみを通します。

書き方は様々にあると思いますが、私はこうしました。

認証画面に入力してもまた認証画面が出てしまう場合

これは私が陥ったエラーです。

結論としては、Xserverやサクラインターネットのサーバのデフォルト設定では、この方法で出す認証画面のIDとパスワードが記録されないため、何度入力しても“空”として扱われてしまうためです。

解決方法は、.htaccessにこの3行を書くことです。

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

これで解決するはずです。ぜひお試しください。

この記事をシェアする

  • Twitterにシェア
  • facebookにシェア
  • LINEにシェア
  • POCKETにシェア
Posted in PHP