phpでベーシック認証
ベーシック認証とは、事前に作成したユーザーとパスワードを持つ人にのみページを公開したい時、簡単に使用できるのがベーシック認証です。
ここでは、phpによる ベーシック認証 を紹介します。
ベーシック認証 の仕組みについては、次のページを参照してください。[ベーシック認証]
Apacheによる ベーシック認証 は、次のページを参照してください。[Apacheによるベーシック認証 ]
PHPによるHTTP認証のフック
この機能は、 Apacheモジュールとして実行した時のみ 有効で、CGI版では利用できません。 仕組みとしては、Apache等がクライアントとのやり取りを行うのと同様のことを php で実現することになります。
<?php
function AuthenticateUser($user,$pwd){
//ファイルやDBを使ってユーザーをチェックします。
}
if(!isset($_SERVER["PHP_AUTH_USER"])) {
header("WWW-Authenticate: Basic realm=\"Please Enter Your Password\"");
header("HTTP/1.0 401 Unauthorized");
//キャンセル時の表示
echo "Authorization Required";
exit;
}
else {
if(AuthenticateUser($_SERVER["PHP_AUTH_USER"],$_SERVER["PHP_AUTH_PW"])){
//認証成功後の処理
}
else {
//認証エラーの処理
}
}
?>
それでは、ソースを見てみます。
$_SERVER[“PHP_AUTH_USER”] に値がセットされているかどうかでリクエストに Authorization ヘッダが指定されているかどうか判断を置き換えています。
$_SERVER[“PHP_AUTH_USER”] に値がセットされていない場合、レスポンスとして WWW-Authenticate ヘッダを送信します。
Authorization ヘッダにユーザー名とパスワードが設定されている場合、それらが正しいかをチェックします。
正しければ、ページを表示します。
Realm は、大きく分けて二つの機能を提供します。
一つ目は、クライアントがパスワードダイアログボックスの 一部としてユーザにこの情報をよく提示する、というものです。 二つ目には、クライアントが与えられた認証領域に対してどのパスワードを送信すれば良いのかを決定するために使われる機能です。
MySQL と phpによるベーシック認証
それでは、当ページの主旨らしくMySQLを使って認証をしてみようと思います。
とはいえ、DBに登録されたユーザーとパスワードをチェックするだけのことです。
DBのテーブルを次のように定義します。
create table ms_user(
user varchar(20) not null,
pwd varchar(16) not null,
PRIMARY KEY (user)
);
ソースは次のようになります。
function AuthenticateUser($user,$pwd){
global $db;
$bRet = false;
$sql = "SELECT pwd FROM user WHERE user = '" . $user . "'";
$dyn = $db->Query($sql);
if(!$dyn){
return $bRet;
}
$rec = $db->FetchRow($dyn);
//md5関数やcrypt関数を使うのもいいですね。
//でも、もとが平文ではなんとも・・・
if($rec['pwd'] == $pwd){
$bRet = true;
}
else{
$bRet = false;
}
$db->FreeQuery($dyn);
return $bRet;
}
$db = new B3DB($dbhost,$dbuser,$dbpwd,$dbname);
if(!isset($_SERVER["PHP_AUTH_USER"])) {
header("WWW-Authenticate: Basic realm=\"Please Enter Your Password\"");
header("HTTP/1.0 401 Unauthorized");
//キャンセル時の表示
echo "Authorization Required";
exit;
}
else {
if(AuthenticateUser($_SERVER["PHP_AUTH_USER"],$_SERVER["PHP_AUTH_PW"])){
//認証成功後の処理
}
else {
//認証エラーの処理
}
}