問題
Apache のサーバーでウェブサービスを動かしていて、領域 /private1/
と /private2/
以下を共通の .htpasswd ファイルを使った Basic 認証必須の設定としている。
想定している動作としては、ブラウザで /private1/
を開いて1度パスワードを入力したのであれば、/private2/
以下にアクセスしたときに、再度パスワード入力を要求されたくない。
しかし、今回はそうではなく、/private1/
以下へのアクセスの後に /private2/
以下にアクセスしたとき、再度のパスワードの要求が行われてしまった。 もちろん、その逆も同様である。
原因
今回、Basic認証の設定は /private1/.htaccess
と /private2/.htaccess
でそれぞれBasic認証の設定を個別に行っていた。 しかし、作成者がそれぞれ別だったため、AuthUserFile では同じ .htpasswd
ファイルを使っていたが、異なる AuthName を使う設定となっていた。
AuthName ディレクティブでは、認証に使う Realm (訳注: 領域) を設定します。Realm は大きく分けて二つの機能を提供します。 一つ目は、クライアントがパスワードダイアログボックスの 一部としてユーザにこの情報をよく提示する、というものです。 二つ目には、クライアントが与えられた認証領域に対してどのパスワードを 送信すれば良いのかを決定するために使われる、という機能です。
例えば、"Restricted Files" 領域中で 一度認証されれば、同一サーバ上で "Restricted Files" Realm としてマークされたどんな領域でも、クライアントは 自動的に同じパスワードを使おうと試みます。 このおかげで、複数の制限領域に同じ realm を共有させて、 ユーザがパスワードを何度も要求される事態を 防ぐことができます
https://httpd.apache.org/docs/2.4/ja/howto/auth.html
とあるため、クライアントブラウザ側の入力を1度で済ませたい場合、同じ名前の AuthName を設定する必要がある。
なお、Chrome 以外のブラウザではダイアログにこれを表示してくれるが、Chrome では AuthName 部分が表示されないため少し注意のこと。