[Perl] WWW::MechanizeでBasic/Digest認証で保護されたページを読む

WWW::Mechanizeは、LWP::UserAgentを継承しているので、
LWP::UserAgentと同じ方法でBasic or Digest認証が出来ます。

リクエスト発生からの処理の流れは、

  • LWP::UserAgent::get
  • LWP::UserAgent::request
  • LWP::Authen::[Basic|Digest]::authenticate
  • LWP::UserAgent::get_basic_credentials

perldoc LWP::UserAgentを読むと、Basic/Digest認証を使うには
サブクラスを作成しget_basic_credentials をオーバーライドするか、
credentials メソッドでパスワードを設定する。と書かれている。
credentials メソッドのほうが簡単そうなのでそちらを見てみる。

 $ua->credentials( $netloc, $realm, $uname, $pass )
  • $netloc は、ドメイン名とポート番号から成る文字列(例: "example.com:80") http:// は含まない。
  • $realm は、プロンプトに表示される名前。Apacheの設定で言うと、AuthNameで設定する文字列。
  • $unameと$pass は、想像通りユーザ名とパスワード。

サンプルコード

 use WWW::Mechanize;
 
 my $ua = WWW::Mechanize->new;
 $ua->credentials('localhsot:80', 'Test Auth', 'test', 'test');
 $ua->get("http://localhost/member/index.html");

第二引数の$realmってのがわかり難かったので、
Apacheの設定を例に説明すると ...

 AuthName "Test Auth" <- $realm に指定する。
                         ブラウザのプロンプトに表示される文字列。
 AuthType Basic       <- 認証メソッド。
                         Basic認証の場合はLWP/Authen/Basic.pm が必要。

ちなみに、サブクラスでget_basic_credentialsをオーバーライドする場合は、
username と password の配列を返すメソッドを作る。