Basic認証

Updated / Published

ID・パスワードによる照合を行ってコンテンツへのアクセスを会員制(メンバー制)にするユーザ認証の仕組みが作れる Basic認証を紹介します。Basic認証には .htaccess ファイルに加えて、ユーザの名簿にあたる .htpasswd ファイルも用意する必要があります。設定したディレクトリ(階層)配下のすべてのファイルが IDとパスワードによる照合を行う認証対象となります。

.htaccess の記述例

AuthType Basic
AuthUserFile /home/w3g/.htpasswd
AuthGroupFile /dev/null
AuthName "Enter password"
Require valid-user

AuthTypeディレクティブはユーザ認証システムの種別を指定します。ユーザ認証システムには、Basic(Basic認証)と DigestMD5認証)があります。ただし、Digest認証の方は UA の対応が乏しいので、多くのUAがサポートしているBasic認証が現実的に用いられます。Basic認証を行うことを示すには、AuthTypeディレクティブに続いて Basic の値を記述します。

2行目の AuthUserFileディレクティブは、認証のためのユーザの名簿がある場所を示します。値には、フルパス(絶対パス)を指定します。ここで言うフルパスとは、通常の絶対URI である http:// からはじまるものとは異なります。レンタルサーバであればユーザページ(管理室)等で確認できるはずです。また、PHPを用いられるサーバなのであれば.httpasswdファイルを置きたい同じ階層に<?php echo __FILE__ ;?>と記述したファイルをアップロードしてからブラウザでアクセスしてみるとそのファイルまでのフルパスが書き出されます。Basic認証の設定でつまづくとすれば、このフルパスの設定が多いでしょう。

3行目の AuthGroupFileディレクティブは、ユーザ認証のためのグループファイルを設定しています。グループファイルは Requireディレクティブで Require group を宣言したときのみ必要になるものです。ここでは AuthGroupFileディレクティブには /dev/null の値を記述しているのでグループファイルは存在しないということを示しています。つまり、この場合はグループごとでのアクセス制限はしないという意味になります。もし、グループファイルを作成する場合は、AuthUserFileディレクティブと同じ様にグループファイルのある場所をフルパスで記述します。

4行目の AuthNameディレクティブはファイルへのアクセス時にダイアログボックスに表示する文字列を指定します。認証を促す注意書きにあたるラベルです。文字列にスペースを含む場合は、文字列全体をダブルクォーテーション(")で囲みます。日本語の指定も可能ですが、.htaccess を保存する際の文字コード(符号化方法)に注意してください。レンタルサーバなどではサーバの設定によって認識できる文字コードが限定されている場合もあります。また、UAに依っても日本語は問題を起こすことが多いようなので、なるべく半角英数字だけを使って入力を案内できる、簡潔な英文あたりを指定される方が無難です。

5行目の Requireディレクティブはユーザ認証の際に、認証させるユーザを指定します。最初の値にパスワード認証の機会を与えるメンバーを指定します。上記の例では、valid-user と記述しています。これは、ユーザの名簿である .htpasswd ファイルに記述されている全てのユーザを許可することを示しています。つまり、IDとパスワードの照合が valid であれば(正しければ)、誰でもそのディレクトリへとアクセスすることが可能であることを示します。ユーザの指定には他にグループ単位であれば、Requireディレクティブに続いて group と記述し、ユーザ単位であれば user と記述します。

.htpasswd ファイルについて

Basic認証の設定は名簿(.htpasswd)に書かれたユーザのみアクセスを許可してくださいという処理を行います。この際に名簿である .htpasswd ファイルが他人に見られては困るので、パスワード部分を暗号化しておくと良いでしょう。ユーザの名簿にあたる .htpasswd は ID(ユーザ名)とパスワード部分をコロン(:)で区切って記述します。パスワードの暗号化については、こちらに暗号化用スクリプトを用意したので、ID部分にアクセスを許可したいユーザ名を、PASS部分にパスワードを入力してご利用ください。

たとえば、ID(ユーザ名)kani に対して、hasami というパスワードを暗号化した場合、.htpasswd ファイルには

kani:327oItuyNNEpM

と記述して、AuthUserFileディレクティブで指定した場所に、.htpasswdファイルを設置します。また、あるユーザが会員を退会して、そのユーザを削除する必要がある場合は、テキストエディタなどでそのユーザの行ごと削除するだけで済みます。

また、この.htpasswd はいくら暗号化させていても悪意のある人に見られてしまうと、解読されることが起こりえるかもしれません。そこで、このファイルを隠すようにしておくとより安全です。最も安心なのは、サーバの公開領域(public_htmlやhtdocs) 以降に設置しないことです。公開領域、非公開領域がわからないという場合は.htaccess を使って隠す方法があります。

1つ目は、Filesディレクティブで指定されているファイル名だけに、Filesディレクティブの中で定義されている他のディレクティブを適用させて、.htpasswd ファイルへのアクセスを拒否させる方法です。

<Files ~ "^.htpasswd$">
deny from all
</Files>

2つ目に、AddHandlerディレクティブで .htpasswd ファイルを CGIスクリプトとして扱うように設定することで、ファイルの中身を参照することができないようにさせる方法です。

AddHandler cgi-script htpasswd

.htpasswd へのリネームはリモートで行う

これはちょっとしたTipsとして紹介しますが、認証を行う名簿の .htpasswd ファイルは .htaccess ファイルと同じようにドット(.)からはじまっていて通常のファイル名にあたる部分がなく拡張子だけで構成されているようなファイル名になっています。

このためテキストエディタなどで「名前をつけて保存」を選択した際に、利用されているテキストエディタによっては、.htpasswd として保存したはずが、勝手に .htpasswd.txt のようにリネームされることがあります。これは利用されているテキストエディタでは拡張子がつけられていないものに対しては、".txt" などの拡張子を自動的につける設定になっているため .htpasswd というファイルで保存することができないためです。

そのため、このような場合はローカルでは .htpasswd.txt などのファイル名のままで保存しておき、FTP でウェブサーバ上に .htpasswd.txt をアップロードしてから、ウェブサーバ側にあるファイルをリモート操作で .htpasswd へとリネームするのが確実な方法です。