Pear で ベーシック認証(Passwd ファイル編)[Pear::Auth_HTTP]

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にcryptTypeMD5と指定しています。 また、Optionに配列ではなくファイル名(パスワードを保存した)のみを指定した場合、authTypeが 正しく指定されなかったため、OptionにauthTypebasicとして指定しています。

次に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 . "の認証に成功!";
}

?>