PHPの基礎 - ユーザ認証
概要
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('このページを見るにはログインが必要です');
}
}
// 認証成功時は、処理はここに移る
以上が、認証の簡単な流れとなる。