PHP による HTTP 認証のフックは、Apache モジュールとして実行した時のみ 有効です。Apache モジュール PHP スクリプトにおいて、 Header 関数を使用して "Authentication Required" メッセージをクライアントブラウザに送ることが可能です。 これにより、クライアントブラウザにユーザー名とパスワードを入力する ウインドウがポップアップ表示されます。 一度、ユーザーがユーザー名とパスワードを入力すると、 PHP スクリプトを含むその URL は、次回以降、 $PHP_AUTH_USER、$PHP_AUTH_PW、$PHP_AUTH_TYPE にそれぞれユーザー名、 パスワード、認証型を入力してコールされます。 現在、"Basic" 認証のみがサポートされています。 詳細は、Headerを参照下さい。
ページ上でクライアント認証を強制するスクリプトの例を 以下に示します。
例 16-1. HTTP 認証の例
<?php if(!isset($PHP_AUTH_USER)) { Header("WWW-Authenticate: Basic realm=\"My Realm\""); Header("HTTP/1.0 401 Unauthorized"); echo "ユーザーがキャンセルボタンを押した時に送信されるテキスト\n"; exit; } else { echo "Hello $PHP_AUTH_USER.<P>"; echo "あなたは $PHP_AUTH_PW をパスワードとして入力しました。<P>"; } ?>
単に $PHP_AUTH_USER、$PHP_AUTH_PW を出力するのではなく、 ユーザー名とパスワードの有効性をチェックしたいと思うかもしれません。 その場合、クエリーをデータベースに送るか、ある dbm ファイル中の ユーザーを調べるといったことをすることになるでしょう。
バグのある Internet Explorer ブラウザには注意してください。 このブラウザは、ヘッダの順序に関してとてもうるさいようです。 今のところ、HTTP/1.0 401 ヘッダの前に WWW-Authenticate ヘッダを送るのが 効果があるようです。
誰かが従来の外部機構による認証を行ってきたページのパスワードを暴く ようなスクリプトを書くことを防ぐために、特定のページに関して 外部認証が可能である場合、PHP_AUTH 変数はセットされません。 この場合、外部認証されたユーザーかどうかを確認するために $REMOTE_USER 変数を使用することができます。
しかし、上記の機能も、認証を要求されない URL を管理する人が 同じサーバーにある認証を要する URL からパスワードを 盗むことを防ぐわけではありません。
サーバーからリターンコード 401 を受けた際に、 Netscape および Internet Explorer は共にローカルブラウザのウインドウ上の 認証キャッシュを消去します。 この機能により、簡単にユーザーを "ログアウト" させ、 強制的にユーザー名とパスワードを再入力させることができます。 この機能は、"タイムアウト" 付きのログインや、"ログアウト" ボタンに 適用されています。
例 16-2. 新規に名前/パスワードを入力させるHTTP 認証の例
<?php function authenticate() { Header( "WWW-authenticate: basic realm='Test Authentication System'"); Header( "HTTP/1.0 401 Unauthorized"); echo "このリソースにアクセスする際には有効なログインIDとパスワードを入力する必要があります。\n"; exit; } if(!isset($PHP_AUTH_USER) || ($SeenBefore == 1 && !strcmp($OldAuth, $PHP_AUTH_USER)) ) { authenticate(); } else { echo "ようこそ: $PHP_AUTH_USER<BR>"; echo "Old: $OldAuth"; echo "<FORM ACTION=\"$PHP_SELF\" METHOD=POST>\n"; echo "<INPUT TYPE=HIDDEN NAME=\"SeenBefore\" VALUE=\"1\">\n"; echo "<INPUT TYPE=HIDDEN NAME=\"OldAuth\" VALUE=\"$PHP_AUTH_USER\">\n"; echo "<INPUT TYPE=Submit VALUE=\"Re Authenticate\">\n"; echo "</FORM>\n"; } ?>
この動作は、HTTP Basic認証の標準に基づいていません。 よって、この機能に依存しないように注意する必要があります。 Lynx によるテストの結果、Lynx は、認証証明書を 401 サーバー応答 によりクリアしないことが明らかになっています。 このため、back を押してから foward を再度押すことにより (証明書の要件が変更されない限り)リソースをオープンすることができます。
Microsoft の IIS サーバーと CGI 版の PHP の組み合わせでは、 この機能は、IIS の制約により使用することができないということにも 注意して下さい。