-mod_auth_cookie (インストール編) - 理系学生日記 -mod_auth_cookie (設定編) - 理系学生日記 -mod_auth_cookie (テスト編) - 理系学生日記
**テスト用 CGI
ここでは,クライアントにクッキーを設定するための単純な CGI (cookie.cgi) を作成しました.この CGI にアクセスすると,test1 ユーザの id/pass が Set-cookie: ヘッダによってブラウザに送られるはずです.
|perl|
!/usr/bin/perl -T
use strict; use warnings; use CGI;
my $q = CGI->new;
my $cookie = $q->cookie( -name => 'idpass', -value => "test1:test1", );
print $q->header( { type => 'text/html', -cookie => $cookie } ), $q->start_html( -title => 'set cookie' ), $q->h1( 'Setting Cookie to Your Browser' ), $q->end_html; ||<
**テスト
では実験です.まずは ブラウザから cookie.cgi にアクセスします.この時に送られる HTTP リクエスト/レスポンスヘッダの抜粋は以下のようになり,Set-Cookie ヘッダによって test1 ユーザの id/pass がブラウザに送られていることが確認できます.
|bash| GET /cgi-bin/cookie.cgi HTTP/1.1
HTTP/1.x 200 OK Set-Cookie: idpass=test1%3Atest1; path=/ Content-Type: text/html; charset=ISO-8859-1 ||<
では,この後 test1 ユーザにしかアクセスできない /var/www/basic-test1/a.txt にアクセスしてみます.以下では敢えて HTTP リクエストによって送られている全てのヘッダを示しました. 注目すべきなのは,Authorization ヘッダが送られていないにも関わらず,Basic 認証の対象である a.txt に GET をすると 200 OK が返ってきていることであり,これによってクッキーによる Basic 認証が確認できました.
GET /basic-test1/a.txt HTTP/1.1 Host: my-webserver.com User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.0.5) Gecko/2008120121 Firefox/3.0.5 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: idpass=test1%3Atest1 HTTP/1.x 200 OK
もちろん,この状態で /var/www/basic-test2/a.txt にアクセスしてみると,401 Authorization Required が返ってきて,id/pass を要求されます.
GET /basic-test2/a.txt HTTP/1.1 Host: my-webserver.com User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.0.5) Gecko/2008120121 Firefox/3.0.5 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: idpass=test1%3Atest1 HTTP/1.x 401 Authorization Required
正しく動いているようですね.
**Cookie
ちなみに Cookie の方も,セッションが切れたら削除されるようになっています.
**Base64 変換
まぁ Cookie を覗けば id も pass も読めるというのは大変不安になるので,Base64 変換するのも良いかもしれません.とは言え平文とほとんど変わりませんが. そういうわけで,CGI を改修して,id/pass を Base64 変換したものを Cookie に載せるようにします.
|perl| use strict; use warnings; use CGI; use MIME::Base64 ();
my $q = CGI->new;
my $cookie = $q->cookie( -name => 'idpass', -value => MIME::Base64::encode( "test1:test1" ), );
print $q->header( { type => 'text/html', -cookie => $cookie } ), $q->start_html( -title => 'set cookie' ), $q->h1( 'Setting Cookie to Your Browser' ), $q->end_html; ||<
これによって,Set-Cookie ヘッダには Base64 変換した結果の文字列が載せられます.
HTTP/1.x 200 OK Date: Sun, 21 Dec 2008 09:43:54 GMT Server: Apache/2.2.9 (Ubuntu) mod_ssl/2.2.9 OpenSSL/0.9.8g mod_perl/2.0.4 Perl/v5.10.0 Set-Cookie: idpass=dGVzdDE6dGVzdDE%3D%0A; path=/ Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 273 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html; charset=ISO-8859-1
結果としてブラウザから送られる Cookie にも Base64 変換したものが載せられることになるので,mod_auth_cookie でもそれに対応しなければなりません.この対応付けを行ってくれるのが AuthCookieBase64 ディレクティブですね.こんな感じにすれば,Base64 変換した結果の文字列が Cookie に載せられる場合に対応できるようになります.
|apache|
AuthName "Members Only" AuthType Basic AuthUserFile /etc/apache2/htpasswd Require user test1 AuthCookieName idpass AuthCookieOverride On AuthCookieBase64 On ||<