OpenIG自習室(第3回:代理認証 Lv.1)

takaです。

前回はOpenIGのインストールと動作テストを行いました。
今回は、OpenIGのメイン機能とも言える代理認証機能を実現してみます。
まずはレベル1ということで、簡単な設定を使ってやってみましょう。

検証作業は、前回同様以下の環境で実施しています。
OS :Ubuntu 12.04 LTS
CPU:Intel Celeron 2.20GHz
MEM:2GB

アプリケーションサーバ:target.example.com(192.168.0.10)
OpenIGサーバ             :gateway.example.com(192.168.0.20)


1. ターゲットアプリケーションの準備

代理認証というくらいですから、認証を行うアプリケーションが必要です。
ForgeRock社のドキュメントでは、WordPress を使っています。
すでにWordPressを使っている方、WordPressの導入が容易な方はWordPressを使っていただければ結構です。
導入にはハードルが高い、面倒、訳あって使えない、などであれば簡単な認証アプリケーションを用意しましょう。
PHPを使える環境があれば、以下のスクリプトをサーバにアップして準備完了です。

■login.php

<?php
header('Content-Language: ja');
header('Content-Type: text/html; charset=UTF-8');

define("USERID", "foo");
define("PASSWORD", "bar");

session_start();

if(isset($_POST["action"]) && $_POST["action"]==="login"){
    if(USERID === $_POST["userid"] && PASSWORD === $_POST["password"]){
        $_SESSION["TEST"] = array("USERID"=>$_POST["userid"],"PASSWORD"=>md5(PASSWORD));
        header("Location:admin.php");
    }else{
        session_destroy();
        message();
    }
}

function message(){
    print "ユーザー名またはパスワードが違います";
}
?>
<form method="post">
USER: <input name="userid" type="text" value="<?php echo USERID; ?>" />
PASS: <input name="password" type="text" value="<?php echo PASSWORD; ?>" />
<input name="action" type="submit" value="login" />
</form>

■admin.php

<?php
header('Content-Language: ja');
header('Content-Type: text/html; charset=UTF-8');

define("USERID", "foo");
define("PASSWORD", "bar");

session_start();

if(isset($_SESSION["TEST"]) && $_SESSION["TEST"] != null && USERID === $_SESSION["TEST"]["USERID"] && md5(PASSWORD) === $_SESSION["TEST"]["PASSWORD"]){
    print "Login success";
}else{
    session_destroy();
    header("Location:login.php");
}
?>

WebTecNote さんのスクリプトを参考にさせていただきました。ありがとうございます!

http://target.example.com/sample/ というURLに設置するという前提で説明します。
http://target.example.com/sample/login.php を開くと、ログインフォームが表示されます。
テキストフォームにはデフォルトで値が入力済みとなっていますので、そのまま送信してみましょう。
ログイン成功のメッセージが表示されるはずです。
念のため、フォームの文字を変更するとログイン失敗と表示されます。

■ログインフォーム

簡易認証アプリケーション - ログイン

■ログイン成功

■ログイン失敗

これで、ターゲットアプリケーションの準備は完了しました。

2. OpenIG設定ファイルの変更

【WordPress】
WordPressを使う方は、ForgeRock社が提供しているサンプルのコンフィグファイルに含まれる WordPressLogin.json を使います。
なお、コンフィグファイルは config.json にリネーム(またはシンボリックリンクを張る)して、Tomcat実行ユーザーのホームディレクトリ($HOMEとします)以下にある {$HOME}/.ForgeRock/OpenIG/ に設置してください。

以下の箇所を実際の環境に合わせて修正してください。

9行 :baseURI のURL
40行:uri のURL
42行:log のユーザー名
43行:pwd のパスワード
45行:redirect_to のURL

【簡易認証アプリ】
簡易認証アプリケーションを使う方は、WordPressLogin.json を以下のようにカスタマイズします。
カスタマイズしたコンフィグファイルは config.json にリネーム(またはシンボリックリンクを張る)して、Tomcat実行ユーザーのホームディレクトリ($HOMEとします)以下にある {$HOME}/.ForgeRock/OpenIG/ に設置してください。

{
    "heap": {
        "objects": [
            {
                "name": "HandlerServlet",
                "type": "HandlerServlet",
                "config": {
                    "handler": "DispatchHandler",
                    "baseURI": "http://192.168.0.10:80"
                }
            },
            {
                "name": "DispatchHandler",
                "type": "DispatchHandler",
                "config": {
                    "bindings": [
                        {
                            "condition": "${exchange.request.uri.path == '/sample/login.php'}",
                            "handler": "LoginChain",
                        },
                        {
                            "handler": "ClientHandler",
                        }
                    ]
                }
            },
            {
                "name": "LoginChain",
                "type": "Chain",
                "config": {
                    "filters": ["LoginRequestFilter"],
                    "handler": "ClientHandler"
                }
            },
            {
                "name": "LoginRequestFilter",
                "type": "StaticRequestFilter",
                "config": {
                    "method": "POST",
                    "uri": "http://192.168.0.10:80/sample/login.php",
                    "form": {
                        "userid": ["foo"],
                        "password": ["bar"],
                        "action": ["login"]
                    }
                }
            }, 
            {
                "name": "ClientHandler",
                "type": "ClientHandler",
                "config": {
                }
            }
        ]
    },
    "servletObject": "HandlerServlet",
}

以下の箇所は実際の環境に合わせて修正してください。

9行 :baseURI のURL
18行:condition のURL(ログインページのURLを記載)
40行:uri のURL(同上)

設定ファイルを変更した場合は、OpenIGが稼働するWebアプリケーションコンテナを再起動します。

3. 動作テスト

【WordPress】
OpenIGの設定ファイルで指定したユーザーアカウントを、WordPressで事前に作成します。
接続元のクライアントより、Webブラウザでターゲットアプリケーションを閲覧します。
デフォルトであれば画面の右下に「ログイン」リンクがあります。
「ログイン」リンクをクリックすると、自動的に設定済みユーザーでログインできることを確認します。

【簡易認証アプリ】
接続元のクライアントより、Webブラウザでターゲットアプリケーションを閲覧します。
http://target.example.com:8080/sample/admin.php(URLは実際の環境に合わせてください)
自動的にログイン成功画面が表示されることを確認します。

※WordPress、簡易認証アプリ共に、ポート番号は8080を指定してください(Tomcat使用の場合)。
あくまでもブラウザで閲覧する先は、OpenIGサーバです。

さて、うまくいきましたでしょうか?
簡単な設定で代理認証を実現できることがお分かりになったかと思います。

次回は、代理認証がどのように行われているか、その仕組みを見てみます。


(参考サイト)

ForgeRock社のドキュメント、および以下のサイトを参考にさせていただきました。

パスワード認証ログインシステムのサンプル
http://tenderfeel.xsrv.jp/php/628/
初心者向けPHP5でつくるログイン機能のサンプルアプリケーション
http://d.hatena.ne.jp/replication/20100828/1282994791