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 {
            //認証エラーの処理
        }
    }