CatalystアプリケーションにBasic認証をかけて密かにアプリを開発できるようにする

はじめに

この前の「どこでもCatalystを実験できる環境を整備する」のエントリーで、Catalystをリモートの環境からでも実験できるようにするための準備方法について説明しました。このままの状態でも開発はできるのですが、開発中のアプリを見知らぬ人に見られてしまう可能性があります。これでは安心して開発ができません。そこで今回は、次のステップとして、CatalystアプリケーションにBasic認証をかける方法を簡単に書きたいと思います。

Catalyst::Plugin::Authentication::Basic::Remoteのインストール

CatalystアプリケーションにBasic認証の機能を付加するプラグインとして、Catalyst::Plugin::Authentication::Basic::Remoteがあります。ローカルサーバではなくリモートサーバのBasic認証の領域を利用します。モジュールの名前空間の一部に「Remote」とあるのは、そのためです。

いつものようにCPANシェルでインストールします。問題なくインストールできました。

[ysano@fedora ~]$ sudo perl -MCPAN -e "install Catalyst::Plugin::Authentication::Basic::Remote"

サンプルアプリケーション: Himitu

Catalyst::Plugin::Authentication::Basic::Remoteの実験ということで、「Himitu」というサンプルアプリケーションを書いていきたいと思います。

まずは、Catalystアプリケーションの枠組みをcatalyst.plを使って生成します。

[ysano@fedora ~]$ catalyst.pl Himitu
created "Himitu"
created "Himitu/script"
created "Himitu/lib"
created "Himitu/root"
created "Himitu/t"
created "Himitu/t/M"
created "Himitu/t/V"
created "Himitu/t/C"
created "Himitu/lib/Himitu"
created "Himitu/lib/Himitu/M"
created "Himitu/lib/Himitu/V"
created "Himitu/lib/Himitu/C"
created "Himitu/lib/Himitu.pm"
created "Himitu/Build.PL"
created "Himitu/Makefile.PL"
created "Himitu/README"
created "Himitu/Changes"
created "Himitu/t/01app.t"
created "Himitu/t/02pod.t"
created "Himitu/t/03podcoverage.t"
created "Himitu/script/himitu_cgi.pl"
created "Himitu/script/himitu_fastcgi.pl"
created "Himitu/script/himitu_server.pl"
created "Himitu/script/himitu_test.pl"
created "Himitu/script/himitu_create.pl"

生成されたHimituディレクトリに移動して、Viewのコードを生成します。ViewにはTemplate-Toolkitをとりあえず使います。

[ysano@fedora ~]$ cd Himitu/
[ysano@fedora Himitu]$ ./script/himitu_create.pl view TT TT
created "/home/ysano/Himitu/script/../lib/Himitu/V/TT.pm"
created "/home/ysano/Himitu/script/../t/V/TT.t"

次にcatalyst.plで生成されたControllerのコードを修正していきます。不要なPODを消すと以下のようになります。

[ysano@fedora Himitu]$ emacs lib/Himitu.pm
use strict;
use Catalyst qw/-Debug/;

our $VERSION = '0.01'; 

Himitu->config( name => 'Himitu' );
Himitu->setup;

sub default : Private {
    my ( $self, $c ) = @_; 
    $c->res->output('Congratulations, Himitu is on Catalyst!');
}

1;

さて、それではHimituにBasic認証の機能を組み込みます。変更したコードはHimitu->config()とHimitu->setup()だけです。Catalyst::Plugin::Authentication::Basic::Remoteのperldocの「SYNOPSIS」に書かれているコードをほとんどそのまま利用しています。特に難しいことは無いと思います。「auth_url」にBasic認証で利用するリモートサーバのURLを書いておくのがポイントです。

[ysano@fedora Himitu]$ emacs lib/Himitu.pm
package Himitu;

use strict;
use Catalyst qw/-Debug/;

our $VERSION = '0.01'; 

Himitu->config(
    authentication => {
        auth_url => 'http://labserver/restricted/area',
        view_tt  => 'Himitu::V::TT',
        template => '401.tt',

        auth_name => 'Require Authorization',
    },
);

Himitu->setup(qw/Authentication::Basic::Remote Session::FastMmap/);

sub default : Private {
    my ( $self, $c ) = @_; 
    $c->res->output('Congratulations, Himitu is on Catalyst!');
}

1;

最後に、認証が失敗した時に利用されるテンプレートを書いておきます。root以下に保存しておけば良いようです。

[ysano@fedora Himitu]$ vi root/401.tt
<html>
    <body>
        <h1>認証に失敗しました</h1>
    </body>
</html>

Catalyst付属のhttpdを起動してテスト

それでは、scriptディレクトリ以下にある「himitu_server.pl 」を実行して、テスト用のhttpdを起動します。この状態でhttp://fedora:3000/(私の場合は事情によりhttp://labserver:8080)にアクセスすると、良く見るBasic認証のダイアログボックスが表示されます。認証に成功すると「Congratulations, Himitu is on Catalyst!」とブラウザに表示されるはずです。逆に失敗すると、「認証に失敗しました」と表示されます。

[ysano@fedora Himitu]$ ./script/himitu_server.pl 
[Wed Nov  2 07:08:13 2005] [catalyst] [debug] Debug messages enabled
[Wed Nov  2 07:08:13 2005] [catalyst] [debug] Loaded plugins:
.-----------------------------------------------------------------------------.
| Catalyst::Plugin::Authentication::Basic::Remote                             |
| Catalyst::Plugin::Session::FastMmap                                         |
'-----------------------------------------------------------------------------'

[Wed Nov  2 07:08:13 2005] [catalyst] [debug] Loaded dispatcher "Catalyst::Dispatcher"
[Wed Nov  2 07:08:13 2005] [catalyst] [debug] Loaded engine "Catalyst::Engine::HTTP"
[Wed Nov  2 07:08:13 2005] [catalyst] [debug] Found home "/home/ysano/Himitu"
[Wed Nov  2 07:08:13 2005] [catalyst] [debug] Loaded components:
.-----------------------------------------------------------------------------.
| Himitu::V::TT                                                               |
'-----------------------------------------------------------------------------'

[Wed Nov  2 07:08:13 2005] [catalyst] [debug] Loaded private actions:
.--------------------------------------+---------------------------------------.
| Private                              | Class                                 |
|=-------------------------------------+--------------------------------------=|
| /default                             | Himitu                                |
'--------------------------------------+---------------------------------------'

[Wed Nov  2 07:08:13 2005] [catalyst] [info] Application powered by Catalyst 5.33
You can connect to your server at http://fedora:3000/

おわりに

今回紹介した方法と前回のHackを組み合わせることで、Catalystを本当の意味でどこにからでも安心して開発できるようになります。Catalyst付属のhttpdは、開発中だけ起動させるようにすれば、セキュリティー上のリスクはそれほど高くないのではないでしょうか。