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認証)と Digest
(MD5認証)があります。ただし、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 へとリネームするのが確実な方法です。