PHPの基礎 - ユーザ認証

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

PHPにおいて、ベーシック認証およびダイジェスト認証を使用して、ユーザ認証する手順を記載する。


認証ダイアログの表示

HTTPにおいて、ベーシック認証を行う手順は以下の通りである。

まず、ユーザ認証が必要なWebページを作成したとする。
クライアントから、そのWebページに対してアクセス要求がある時、Authorizationヘッダの有無を確認する。

PHPにおいて、Authorizationヘッダの有無を確認する場合、定義済みの変数である$_SERVERの値を確認する。
定義済みの変数$_SERVERは、ヘッダ、パス、スクリプトの位置等の情報を持つ配列である。
この配列の中にあるPHP_AUTH_USERに対応する値の有無を確認する。

 if(!isset($_SERVER['PHP_AUTH_USER']))
 {
    // ...略
 }


上記で使用しているisset関数は、変数が代入されているかどうかを確認する関数である。

bool isset ( mixed var [, mixed var [, ...]] )

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


Authorizationヘッダが無い場合、認証ダイアログをWebブラウザで表示するように、サーバからクライアントへ指示を出す。
これには、header関数を使用して、以下のように記述する。
header関数は、生のHTTPヘッダをクライアントへ送信するための関数である。

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


詳細は省くが、上記のように、クライアントへ送信するとWebブラウザ上で認証画面が表示される。

認証ダイアログで[キャンセル]ボタンを押下する場合、プログラムの処理は以下の位置から始まる。
以下の例では、[キャンセルボタン]を押下した場合、エラー表示をしてプログラムを終了させている。

 if(!isset($_SERVER['PHP_AUTH_USER']))
 {
    header('WWW-Authenticate: Basic realm="Private Page"');
    header('HTTP/1.0 401 Unauthorized');
 
    // [キャンセル]ボタンの押下時の処理
    die('このページを見るにはログインが必要です');
 }


認証ダイアログにおいて、ユーザ名とパスワードを入力して[OK]ボタンを押下する時、
ユーザ名とパスワードの情報を付加したAuthorizationヘッダを、再度、サーバへ送信(リクエスト)する。
その時、再度、$_SERVER['PHP_AUTH_USER']に値が設定されているか確認される。

例えば、ユーザ名が未入力の状態でも、$_SERVER['PHP_AUTH_USER']にはNULLが設定されるため、
いずれの場合でも、認証ダイアログで[OK]ボタンを押下する場合は、この変数に値が代入されていることになる。

したがって、次の位置へ処理が移る。

 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('このページを見るにはログインが必要です');
    }
 }
 
 // 認証成功時は、処理はここに移る


以上が、認証の簡単な流れとなる。