Pear でベーシック認証(Passwd ファイル編)
Pear の中に Auth_HTTP というパッケージがあります。 このパッケージを利用することでベーシック認証を行うことができます。 Auth_HTTPは Authクラスから派生しており、 ユーザーやパスワードの保存先(認証先)は、 非常に豊富でファイルやDB、認証サーバー等柔軟に対応できます。
環境構築
Windows
Passwd ファイルを使用してベーシック認証を行うには、いくつか必要なものが存在します。
暗号化をサポートする mcrypt ライブラリは、ヘルプには「この拡張モジュールは Windows 環境では利用できません。」 と記述されています。しかし、 Windows 用として作成されている libmcrypt.dll を Windows の System32 にインストールすることで使用できるようです。(libmcrypt.dll)
次に、 MD5 , SHAl , GOST などのハッシュを作成する mhash ライブラリが必要になります。 この mhash ライブラリを使用するには、 php をインストールしたフォルダの dlls フォルダ内にある libmhash.dllをWindows\system32 フォルダにコピーします。
各 dll の準備ができたところで、 php.ini の次のコメントを削除します。
extension=php_mcrypt.dll
extension=php_mhash.dll
Linux
Linux の場合、 mcrypt や mhash は、あらかじめ別途インストールしておく必要があります。 もし、最初のインストールの時、コンフィギュレーション・オプションに指定していない場合ライブラリをインストール後、 php をコンパイルしなおす必要があります。
Pear パッケージの導入
Pear のパッケージをインストールします。 必要なパッケージは、 Crypt_CHAP , File_Passwd , File , DB 等が必要になります。
pear install [パッケージ名]
Auth_HTTP で Passwdファイルを使った ベーシック認証
Passwd ファイルを使った認証を次に示します。( Option の渡し方が正しいかどうかは不安が残ります。) 通常、こういった使い方はしないのかなという部分も見られます。 例えば、 addUser メソッドが実装されているのですが、下記オプションでは正常に動作しません。 Option に配列ではなく、ファイル名を与えるとユーザーとパスワードが作成されます。
<?php
require_once "Auth/HTTP.php";
$params = Array(".htpasswd","authType"=>"basic","cryptType"=>"MD5");
$objAuth = new Auth_HTTP("File",$params);
// realm領域名
$objAuth->setRealm('Please Enter Your Password');
// 認証をキャンセルや認証エラーした際に表示されるメッセージ
$objAuth->setCancelText('<h2>Authorization Required</h2>');
// 認証プロセスの開始
$objAuth->start();
if($objAuth->getAuth()) {
echo $objAuth->username . "の認証に成功!";
}
?>
上記コードは、 Windows 上で試したコードです。 Windows 上の Apache2.0.54 の htpasswd コマンドでは、デフォルトが MD5 で暗号化されるようで Auth_HTTP では、デフォルトが crypt_des のようです。 このため、 Option に cryptType を MD5 と指定しています。 また、 Option に配列ではなくファイル名(パスワードを保存した)のみを指定した場合、 authType が正しく指定されなかったため、 Option に authType を basic として指定しています。
次に realm 領域名、認証をキャンセルや認証エラーした際に表示されるメッセージを設定します。
実際に、 WWW-Authenticate を送っているのは、 start() 関数になります。 また、認証処理もこの関数内で行われているようです。
getAuth は、認証済みかどうかを取得する関数になります。
少し強引な例も紹介しておきます。
<?php
require_once "Auth/HTTP.php";
$params = ".htpasswd";
$objAuth = new Auth_HTTP("File",$params);
// realm領域名
$objAuth->setRealm('Please Enter Your Password');
// 認証をキャンセルや認証エラーした際に表示されるメッセージ
$objAuth->setCancelText('<h2>Authorization Required</h2>');
$objAuth->authType = "basic";
// 認証プロセスの開始
$objAuth->start();
if($objAuth->getAuth())
{
echo $objAuth->username . "の認証に成功!";
}
?>