PHPBook

認証ダイアログの表示

広告

PHPかどうかは関係無く、HTTPベースでのやりとりにおいてベーシック認証を行わせる場合の手順は下記の通りです。

まずユーザー認証が必要なページを作成したとします。そのページを見ようとする要求がクライアントからあった場合、「Authorization」ヘッダの有無を確認します。クライアントから初めてアクセスがあった場合には通常はありません。

PHPでこの確認を行う場合は、定義済みの変数である「$_SERVER」の値をチェックします。$_SERVER は、ヘッダ、パス、スクリプトの位置の ような情報を有する配列です。この配列の中の「PHP_AUTH_USER」に対応する値の有無で確認します。

if (!isset($_SERVER['PHP_AUTH_USER'])){

}

上記で使っている"isset"関数は変数がセットされているかどうかを検査する関数です。

isset
bool isset ( mixed var [, mixed var [, ...]] )
変数がセットされているかどうかを検査する

パラメータ:
  var  検査対象の変数
返り値:
  varが存在すればTRUE、そうでなければFALSEを返します。

「Authorization」ヘッダが無かった場合、認証ダイアログをブラウザで表示するようにサーバ側からクライアントへ指示を出します。これには"header"関数を使って下記のように記述します。

if (!isset($_SERVER['PHP_AUTH_USER'])){
    header('WWW-Authenticate: Basic realm="Private Page"');
    header('HTTP/1.0 401 Unauthorized');
}

"header"関数は生のHTTPヘッダをクライアントへ送信するための関数です。詳しい説明は省かせて頂きますが、上記のようにクライアントへ送信するとクライアントのブラウザ上で認証画面が表示されます。

認証画面上でキャンセルを押した場合、プログラムの処理は下記の位置にきます。

if (!isset($_SERVER['PHP_AUTH_USER'])){
    header('WWW-Authenticate: Basic realm="Private Page"');
    header('HTTP/1.0 401 Unauthorized');

    /* キャンセルを押した場合の処理 */
}

キャンセルを押された場合は、エラー表示をしてプログラムを終了させておきます。

if (!isset($_SERVER['PHP_AUTH_USER'])){
    header('WWW-Authenticate: Basic realm="Private Page"');
    header('HTTP/1.0 401 Unauthorized');

    die('このページを見るにはログインが必要です');
}

認証ダイアログ上で、ユーザー名やパスワードなどが入力された上で「O.K.」ボタンを押された場合、「Authorization」ヘッダに入力されたユーザー名とパスワードの情報を付加した状態で再度サーバへリクエストがくるようです。

その為、改めて $_SERVER['PHP_AUTH_USER'] に値が設定されているかどうかがチェックされます。認証ダイアログで仮にユーザー名の部分に何も入力されていなかったとしても、この値にはNULLが設定されるようですのでいずれの場合でも認証ダイアログで「O.K.」ボタンを押した場合はこの変数の値がセットされていることになります。よって次の位置へ処理が移ります。

if (!isset($_SERVER['PHP_AUTH_USER'])){
    header('WWW-Authenticate: Basic realm="Private Page"');
    header('HTTP/1.0 401 Unauthorized');

    die('このページを見るにはログインが必要です');
}else{
    /* 認証ダイアログでO.K.を押した時はここへ処理が移る */
}

今度はユーザー名とパスワードが正しいのかの判別が必要となります。実際にはデータベースなどに事前に登録したユーザー名とパスワードを参照して確認することになると思いますが、ここでは固定のユーザー名とパスワードでチェックしてみます。

if (!isset($_SERVER['PHP_AUTH_USER'])){
    header('WWW-Authenticate: Basic realm="Private Page"');
    header('HTTP/1.0 401 Unauthorized');

    die('このページを見るにはログインが必要です');
}else{

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

        header('WWW-Authenticate: Basic realm="Private Page"');
        header('HTTP/1.0 401 Unauthorized');

        die('このページを見るにはログインが必要です');
    }
}

認証ダイアログで入力されたユーザー名は$_SERVER['PHP_AUTH_USER']で、パスワードは$_SERVER['PHP_AUTH_PW']で取得する事が出来ます。例えばユーザー名は「admin」、パスワードは「pass」と入力された場合だけ認証を通す場合には下記のようになります。

$user = 'admin';
$password = 'pass';

if (!isset($_SERVER['PHP_AUTH_USER'])){
    header('WWW-Authenticate: Basic realm="Private Page"');
    header('HTTP/1.0 401 Unauthorized');

    die('このページを見るにはログインが必要です');
}else{

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

        header('WWW-Authenticate: Basic realm="Private Page"');
        header('HTTP/1.0 401 Unauthorized');

        die('このページを見るにはログインが必要です');
    }
}

/* 認証に成功すればここに処理が来る */

以上が認証の簡単な流れとなります。

サンプルプログラム

では簡単なサンプルで試して見ます。

authtest1.php

<?php
$user = 'admin';
$password = 'pass';

if (!isset($_SERVER['PHP_AUTH_USER'])){
    header('WWW-Authenticate: Basic realm="Private Page"');
    header('HTTP/1.0 401 Unauthorized');

    die('このページを見るにはログインが必要です');
}else{
    if ($_SERVER['PHP_AUTH_USER'] != $user
        || $_SERVER['PHP_AUTH_PW'] != $password){

        header('WWW-Authenticate: Basic realm="Private Page"');
        header('HTTP/1.0 401 Unauthorized');
        die('このページを見るにはログインが必要です');
    }
}

?>

<html>
<head><title>PHP TEST</title></head>
<body>

<p>ようこそ、会員向けページへ</p>

</body>
</html>

上記ファイルをWWWサーバに設置しブラウザ経由で見ると下記のように表示されます。

まず最初にアクセスした時には認証画面が表示されます。

PHPでユーザー認証

キャンセルを押すとエラーメッセージが表示されて終了します。

PHPでユーザー認証

今度は間違ったユーザー名とパスワードを入力してみます。

PHPでユーザー認証

すると再度認証ダイアログが表示されます。(IEではパスワードがクリアされて再表示されました)。

PHPでユーザー認証

最後に正しいユーザー名とパスワードを入力してみます。

PHPでユーザー認証

無事認証が通りホームページが表示されます。

PHPでユーザー認証

( Written by Tatsuo Ikura )