BASIC認証システム

 18章で通常の入力フォームを使った認証システムをご紹介しましたが、やはりBASIC認証を使ったタイプもご紹介しておいた方がいいと思いまして、遅ればせながらこのページを作った次第です。尚、このタイプは、KOMONETの「PHPスクリプト無料配布コーナー」では既に配布しています。

BASIC認証とは…

 BASIC認証システムは、header()関数を使って以下のようなヘッダー情報を送信し、ブラウザに認証ウィンドウを表示させるものです。

header("WWW-Authenticate: Basic realm=\"Sample Script\"");
header("HTTP/1.0 401 Unauthorized");

ただし、このBASIC認証を使った場合、1回でも認証に成功してしまうと、ブラウザを一旦閉じない限り、後は何回でもそのまま入れてしまいます。この点、ちょっと不便に感じる事もあるかな?(^^ゞ

 ユーザーIDとパスワードのセットを保存したテキストファイルの中身は、以下のようなもの(それぞれの値は飽くまでも一例です。)にして下さい。ここで注意が必要なのは、各行の最後にもコンマ「,」を忘れないようにして欲しいと言う点です。これはスクリプトの中のsplit()関数と大いに関係があります。又、このファイルの属性は「644」にして下さい。

komochan,777,
komo,888,
micchan,999,

*注意…尚、今回のスクリプトはPHP4.2.0以降のスーパーグローバル変数に対応したものになっています。

スクリプト本体の内容

<?php
//=============初期設定==============
$data_file = "./d_file.dat"; //データファイルの指定
 
if(!isset($_SERVER['PHP_AUTH_USER'])){
 header("WWW-Authenticate: Basic realm=\"Sample Script\"");
 header("HTTP/1.0 401 Unauthorized");
 exit;
!isset()」は、「変数がセットされていなければ」と言う意味です。「!」は否定を表します。
}else{
 $p_data = file($data_file);
 $p_flag = 0;
 for($i=0; $i<count($p_data); $i++){
  list($id,$pass) = split(",", $p_data[$i]);
  if($id == $_SERVER['PHP_AUTH_USER'] && $pass == $_SERVER['PHP_AUTH_PW']){
   $p_flag++;
   break;
  }
 }
}
認証ウィンドウからデータが送られて来た場合の処理です。

まずIDとパスワードを格納したファイルを読み込みます。認証の可否を判定するフラグ
$p_flagを立て、ループ処理の中で、IDとパスワードの値がそれぞれ一致するか判定します。それぞれが一致した場合は、フラグ$p_flagの値を1増加し、ループ処理を抜けます。
if($p_flag > 0){
 echo "<HTML><HEAD>\n";
 echo "<META HTTP-EQUIV=Content-Type CONTENT=text/html;CHARSET=x-sjis>\n";
 echo "<TITLE>PHP認証システム</TITLE></HEAD>\n";
 echo "<BODY>\n";
 echo "<CENTER><BR><BR><BR><FONT COLOR='blue'>おめでとうございます。あなたは正式に認証されました。<BR><BR>\n";
 echo "ここにお好きなHTML表示を埋め込んで下さい。\n";
 echo "</CENTER></BODY></HTML>\n";
認証が通った場合の処理です。

ここに認証が通った後に表示する内容を埋め込みます。include()で他のファイルを読み込んでもいいでしょう。
}else{
 header("WWW-Authenticate: Basic realm=\"Sample Script\"");
 header("HTTP/1.0 401 Unauthorized");
 echo "<CENTER><FONT COLOR='red'>ユーザー認証が必要です。</FONT>\n";
 exit;
}
?>
認証に失敗した場合は、再度「認証ウィンドウ」を表示します。ついでに警告文も表示しましょう。3回失敗すると、表示されるようです。

 *上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。

HOME