OpenIG自習室(第8回:OpenAM連携 Vol.1)

takaです。

第3回から第6回まで、OpenIGを使った代理認証機能について検証しました。

OpenIGはあくまでリバースプロキシなので、ログインアカウントを管理するわけではありません。
従って実際の運用環境では、シングルサインオンのアカウントは別システムで管理することになります。
そこで今回から、ForgeRock社が提供するアイデンティティ管理システム OpenAM とOpenIGとの連携について検証します。

まず今回はOpenAMのインストールを行います。
OpenAMのインストールや設定については以下のサイトも参考になりますので、ぜひご覧ください。

シングルサインオンとOpenAM – OpenAMで始めるシングルサインオン(2)
http://codezine.jp/article/detail/6319

OpenAMによるシングルサインオン(1)エージェント編
http://tech-sketch.jp/2013/06/openam.html

また、OpenAM関連情報は以下が参考になると思います。
セミナーや勉強会も開催されているので、興味のある方はいかがでしょうか。

OpenSSO & OpenAMコンソーシアム
http://www.openam.jp/

OpenStandia OpenAM最新情報(野村総合研究所)
http://openstandia.jp/oss_info/openam/

オープンソース・ソリューション・テクノロジ株式会社
http://www.osstech.co.jp/

検証作業は、以下の環境で実施しています。
前回、1サーバ上に環境をまとめました)

OS :Ubuntu 12.04 LTS
CPU:Intel Celeron 2.20GHz
MEM:2GB

検証サーバ: www.example.com (192.168.0.10)
アプリケーションサーバ(Apache2+PHP:ポート80)
OpenIGサーバ(Tomcat6:ポート8080)
OpenAMサーバ(Tomcat6:ポート18080)


1. 必要構成

OpenAMをインストールするにあたり、ForgeRock社のドキュメントには推奨構成が記載されています。
空きメモリ(OSや他のアプリケーションで使っている分とは別)が1GB以上、ハードディスク容量は特に言及されていません。

サーバの詳細な要件についてはOpenAM Administration Guide の Tuning OpenAMが参考になります。

JDKは1.5または1.6と書かれていますが、1.6が望ましいようです。
なおForgeRock社は、Oracle Java SE JDKで検証しています。

Webアプリケーションコンテナは、Apache Tomcat、GlassFishなどがサポートされています。
また、データストア(設定やアカウントの保存先)として、ForgeRock社のOpenDJ、MicrosoftのActive Directoryなどがサポートされています。

2. 事前準備(確認事項)

OpenAMをインストールするサーバは、ホスト名をFQDNで名前解決できる必要があります。
インストール前にOSの設定を行ってください。
なお、検証環境であればDNSではなくhostsファイルでの定義で十分です。
ファイアウォールは無効にしておくか、必要なポートを開放するようにしてください。

3. JDKのインストール

JDKのインストール方法については割愛します。
PATHおよび環境変数(JAVA_HOME、CLASSPATH)の設定を忘れずに行ってください。

4. Tomcatのインストール

Tomcatのインストール方法についても割愛します。
第7回も参考になるかと思います)
インストール後、環境変数(CATALINA_HOME、JAVA_OPTS)を設定します。
ここでは CATALINA_HOME(Tomcatのインストールディレクトリ)を /usr/share/tomcat6 とします。
JAVA_OPTS では、OpenAMの起動に必要なパラメータを設定します。

# export CATALINA_HOME="/usr/share/tomcat6"
# export JAVA_OPTS="-Xmx1024m -XX:MaxPermSize=256m"

5. OpenAMのダウンロードと設置

ForgeRock社のダウンロードページよりOpenAMのzipまたはwarファイルをダウンロードします。
現時点(2013年8月)の最新安定版は10.1.0となっています。
なお、最新安定版のダウンロードにはユーザー登録が必要となります。

ダウンロード後は必要に応じて解凍し、Tomcatの場合 $CATALINA_HOME/webapps/ にwarファイルをコピーします。
コピー後、Tomcatを起動します。

6. OpenAMインストール

Tomcatを起動したら、http://www.example.com:18080/openam/ をブラウザで開きます。

初期設定画面が表示されるので、カスタム設定 の 新しい設定の作成 をクリックします。
OpenAMインストール - 初期設定画面

6-1. 一般
デフォルトユーザー(amAdmin)のパスワードを8文字以上で設定します。
amAdminはOpenAMの管理者ユーザーです。
設定が終わったら「次へ」ボタンをクリックします。
OpenAMインストール - 一般

6-2. サーバー設定
デフォルトで設定が入力されています。
サーバーURLとCookieドメインが合っているか確認して「次へ」ボタンをクリックします。
なお、プラットフォームロケールは en_US のままで構いません。
OpenAMインストール - サーバー設定

6-3. 設定データストア設定
最初のインスタンス を選択して「次へ」ボタンをクリックします。
OpenAMインストール - 設定データストア設定

6-4. ユーザーデータストア設定
OpenAMのユーザーデータストア を選択して「次へ」ボタンをクリックします。
外部データストア(OpenDJ、OpenLDAPなど)をお使いの方は、そちらを利用されても結構です。
なお、本番環境では外部データストアの利用が推奨されています。(サポートされていません、とありますが使うことは可能です)
OpenAMインストール - ユーザーデータストア設定

6-5. サイト設定
ロードバランサは使いませんので いいえ のままで「次へ」をクリックします。
OpenAMインストール - サイト設定

6-6. デフォルトのポリシーエージェントユーザー
次回触れますが、OpenAMではポリシーエージェントという外部プログラムを利用します。
この画面では、ポリシーエージェントのパスワードを設定します。
amAdminのパスワードとは別の文字列を設定して「次へ」をクリックします。
OpenAMインストール - デフォルトのポリシーエージェントユーザー

6-7. 設定ツールの概要と詳細
設定内容が表示されますので、内容を確認して「設定の作成」をクリックします。
OpenAMインストール - 設定ツールの概要と詳細

設定中の処理内容が表示されますので、しばらくそのまま待ちます。
OpenAMインストール - 設定中

設定が完了しました、と表示されますので、「ログインに進む」をクリックします。
OpenAMインストール - 設定完了

OpenAMのログイン画面が表示されます。
ユーザー名:amadmin、パスワード:先ほど設定したパスワード、でログインしてみましょう。
OpenAMログイン画面

これでOpenAMのインストール、および初期設定は完了です。

次回はOpenAMの詳細設定について触れます。
OpenIGとOpenAMを連携させるための設定を行い、ターゲットアプリケーションの認証をOpenAMで実施するようにします。


(参考サイト)

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

OpenAM 10.2.0-SNAPSHOT Installation Guide
http://openam.forgerock.org/openam-documentation/openam-doc-source/doc/install-guide/index.html

シングルサインオンとOpenAM – OpenAMで始めるシングルサインオン(2)
http://codezine.jp/article/detail/6319

OpenIG自習室(第7回:検証環境の再構築)

takaです。

前回までは、OpenIGを使った代理認証機能について検証を行ってきました。

実際には、OpenIGは単独で使うものではなく、他のアイデンティティ管理ソリューションと連携して使うのが最も効果的です。
そこで、ForgeRock社が提供するアイデンティティ管理システムの OpenAM を導入し、OpenIGと連携させたいと思います。

ですが、その前に。

検証環境が潤沢に整っている会社または個人の方はさておき、現実的にはそうでない方々(特に自分で勉強しようという方にとっては)の方が多いのではないかと思います。

ここまでの検証では、アプリケーションサーバとOpenIGサーバの2台を使ってきました。
さらにOpenAMサーバを導入することになると、計3台のサーバが必要となります。

本番の運用環境ならばいざしらず、検証用に3台を使うのはVMなどなければ厳しいのではないでしょうか。

ということで今回は、1台のサーバ上で検証を行えるように検証環境を再構築したいと思います。
既に1台で検証されている方など、特に不要な方は読み飛ばしていただいて結構です。

検証作業は、以下の環境で実施しています。
ホスト名は www.example.com に変更しました。

OS :Ubuntu 12.04 LTS
CPU:Intel Celeron 2.20GHz
MEM:2GB

検証サーバ: www.example.com (192.168.0.10)
アプリケーションサーバ(Apache2+PHP:ポート80)
OpenIGサーバ(Tomcat6:ポート8080)
OpenAMサーバ(Tomcat6:ポート18080)→ 今回はTomcatのみ準備


1. ホスト名の変更

ホスト名の変更ですが、特に不要な方は行わなくて結構です。
Ubuntuの場合、以下のように変更します。(rootにて実施しています)

# vi /etc/hostname
www.example.com

そして /etc/hosts も変更します。

# vi /etc/hosts
127.0.0.1    www.example.com

変更後、ネットワークを再起動します。

# /etc/init.d/networking restart

2. アプリケーションサーバ

ターゲットアプリケーションが動作するサーバはApache2とPHPで構築しています。
Ubuntu 12.04の場合、taskselを使ってLAMP環境をまとめてインストールできます。

# apt-get install tasksel

起動後、ソフトウェアの選択画面から LAMP server にスペースキーでチェックを入れます。

tasksel

エンターキーを押すと、インストールが始まります。
画面の指示に従ってインストールを行ってください。

もちろん、個別にインストールすることも可能です。

# apt-get install apache2 php5 libapache2-mod-php5

MySQLやphpMyAdminは必要に応じてインストールしてください。
(簡易認証アプリでは必要です)

# apt-get install mysql-server
# apt-get install php5-mysql
# apt-get install phpmyadmin

インストール後、Apacheの起動確認、PHPの動作確認を行ってください。
また、アプリケーション(WordPress または 簡易認証アプリ)も忘れずに設置しておいてください。

3. OpenIGサーバ用Tomcat6

1台のサーバでTomcat6を2つ(OpenIGとOpenAM)稼働させることになります。
やり方としては、

A. CATALINA_HOMEをまるごとコピー。ポート変更。起動スクリプトをコピーして変更。
B. Tomcat6をもう1つインストールしてポート変更。

のいずれかかな、と思います。
(もっと良いやり方があれば教えて下さい!)

ここでは、OpenAMをパッケージのTomcat6、OpenIGはBinary DistributionsのTomcat6を使います。
ということで、OpenIG用のTomcat6をダウンロードして解凍します。
Tomcat6の最新バージョンは 6.0.37 となっています。

# tar xvzf apache-tomcat-6.0.37.tar.gz
# mv apache-tomcat-6.0.37 /usr/local/
# ln -s /usr/local/apache-tomcat-6.0.37 /usr/local/tomcat6

起動スクリプトを用意します。

# vi /etc/init.d/tomcat6_local

以下のサイトを参考にさせていただきました。
Subsonic on Tomcat 6 | hirooka.pro

#!/bin/bash
#
# tomcat
#
# chkconfig:
# description:  Start up the Tomcat servlet engine.
 
# Source function library.
# /etc/init.d/functions
 
CATALINA_HOME="/usr/local/tomcat6"
TOMCAT_USER='tomcat'
SHUTDOWN_WAIT=20
 
tomcat_pid() {
  echo `ps aux | grep $CATALINA_HOME | grep -v grep | awk '{ print $2 }'`
}
 
start() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]
     then
        echo "Tomcat is already running (pid: $pid)"
     else
        echo "Starting Tomcat"
        /bin/su $TOMCAT_USER $CATALINA_HOME/bin/startup.sh
   fi
 
   return 0
}
 
stop() {
 pid=$(tomcat_pid)
  if [ -n "$pid" ]
  then
 
  echo "Stoping Tomcat"
   /bin/su $TOMCAT_USER $CATALINA_HOME/bin/shutdown.sh
 
   echo -n "Waiting for processes to exit ["
   let kwait=$SHUTDOWN_WAIT
    count=0;
    until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
    do
      echo -n ".";
      sleep 1
      let count=$count+1;
    done
    echo "Done]"
 
    if [ $count -gt $kwait ]
    then
      echo "Killing processes ($pid) which didn't stop after $SHUTDOWN_WAIT seconds"
      kill -9 $pid
    fi
  else
    echo "Tomcat is not running"
  fi
 
  return 0
}
 
status() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]
  then
    echo "Tomcat is running with pid: $pid"
  else
    echo "Tomcat is not running"
  fi
}
 
case "$1" in
 start)
        start
        ;;
 stop)
        stop
        ;;
 restart)
       stop
       start
       ;;
 status)
       status
       ;;
*)
        echo "Usage: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac
exit 0

サーバ起動時に自動起動するようにします。

# chmod 755 /etc/init.d/tomcat6_local
# cd /etc/rc2.d
# ln -s ../init.d/tomcat6_local S99tomcat6_local

起動ユーザーを tomcat にしたので(上記起動スクリプト参照)、Tomcat6のオーナーを変更します。

# chown -R tomcat.tomcat /usr/local/tomcat6

インストール後は、Tomcat6の起動確認を行ってください。
また、第2回を参考に、OpenIGのインストールも行ってください。

なお、config.jsonファイルの修正も必要となりますのでご注意ください。
(ターゲットアプリケーションのURLが変更になります)
また、起動ユーザーがtomcatに変更されているので、.ForgeRockディレクトリは tomcatユーザーのホームディレクトリに設置する必要があります。

第6回でデータベースを使った代理認証を行っていますので、必要な方はJNDI設定も忘れずに行ってください。

4. OpenAMサーバ用Tomcat6

OpenAMサーバ用のTomcat6にはパッケージ版を使います。

# apt-get install tomcat6

ポート番号がOpenIG側Tomcat6と競合してしまうので、変更します。

# cd /var/lib/tomcat6/conf
# vi server.xml

変更は2箇所です。まず1箇所め。

<Server port="8005" shutdown="SHUTDOWN">

このように修正します。ポート番号は任意で結構です。

<Server port="18005" shutdown="SHUTDOWN">

そして2箇所め。

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncodign="UTF-8"
           redirectPort="8443" />

このように修正します。ポート番号は任意で結構です。

<Connector port="18080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncodign="UTF-8"
           redirectPort="18443" />

いずれのサーバも正常に起動、動作しているか確認してください。
特にTomcat6はポートの競合などで起動していないこともあるので注意してください。

これで1台のサーバで検証できる環境が整いました。
次回からはOpenAMの導入とOpenIGとの連携について学びます。


(参考サイト)

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

Subsonic on Tomcat 6 | hirooka.pro
http://hirooka.pro/?p=1304

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

takaです。

前回はテキストファイルからアカウント情報を取得する代理認証を行いました。

今回は、データベースからアカウント情報を取得して代理認証を行ってみます。
実際の環境ではデータベースサーバとOpenIGサーバは別運用であるのが望ましいですが、テストなのでOpenIGサーバ上にデータベースを構築します。

検証作業は、以下の環境で実施しています。

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)
データベースサーバ :gateway.example.com(192.168.0.20)


1. データベースの準備

ここではデータベースとしてMySQLを使います。

1-1. MySQLのインストール
インストール方法は特に記載しませんので、ご利用環境に合わせてデータベースをセットアップしてください。

1-2. データベース作成
テスト用のデータベースを作成します。
データベース名は example としています。

mysql> CREATE DATABASE example;
Query OK, 1 row affected (0.07 sec)

作成したデータベースに切り替えます。

mysql> USE example;
Database changed

1-3. テーブル作成
テスト用のテーブルを作成します。
テーブル名は users としています。
なお、fullname は必須ではありません。

mysql> CREATE TABLE users (
    -> username varchar(50),
    -> password varchar(50),
    -> fullname varchar(50),
    -> email varchar(255)
    -> );
Query OK, 0 rows affected (0.16 sec)

作成したテーブルを確認します。

mysql> SHOW COLUMNS FROM users;
4 rows in set (0.00 sec)

1-4. データ追加
テスト用のデータを作成します。
email の値は、config.json で記載したメールアドレスにしてください。

mysql> INSERT INTO users VALUES ('foo','bar','Foo Bar','foo@example.com');
Query OK, 1 row affected (0.10 sec)

2. Webアプリケーションコンテナの設定

この検証作業ではTomcatを使っていますので、TomcatからMySQLに接続するための設定が必要です。

2-1. JNDI設定
TomcatからMySQLに接続するためのJNDI設定を行います。
リソース名(ここでは forgerock)は任意で結構です。
{MySQL User Name}、{MySQL User Password}、{Database Name}はそれぞれご利用環境に合わせて記述してください。

# vi $TOMCAT_HOME/conf/context.xml

<Resource name="jdbc/forgerock" auth="Container" type="javax.sql.DataSource"
 maxActive="100" maxIdle="30" maxWait="10000"
 username="{MySQL User Name}" password="{MySQL User Password}" driverClassName="com.mysql.jdbc.Driver"
 url="jdbc:mysql://localhost:3306/{Database Name}"/>
# vi $TOMCAT_HOME/conf/web.xml

<resource-ref>
    <description>MySQL Connection</description>
    <res-ref-name>jdbc/forgerock</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

2-2. MySQL Connector/J のインストール
JavaからMySQLを扱うためのJDBCドライバをインストールします。
こちらよりドライバをダウンロードして解凍します。
現在(2013年8月)の最新バージョンは 5.1.25 です。

解凍後は、$TOMCAT_HOME/lib にコピーします。
ubuntu の場合、/usr/share/java 以下にコピーし、/usr/share/tomcat6/lib に mysql-connector-java.jar という名前でシンボリックリンクを張りました。

3. config.json ファイルの変更

ForgeRock社が提供するサンプルのコンフィグファイルに含まれる WordPressLoginSQL.json を参考に、ファイルを修正します。

【WordPress】
WordPressを使っている場合は、ご利用環境に合わせて WordPressLoginSQL.json の以下の箇所を修正してください。

9行 :baseURI のURL
18行:condition のパス
40行:dataSource のデータソースパス
42行:parameters のEメールアドレス
50行:uri のURL
55行:redirect_to のURL

【簡易認証アプリ】
簡易認証アプリケーションを使う方は、第5回で使った config.json を以下のようにカスタマイズします。

a. LoginChain の変更
第5回で追加した FileAttributesFilter を、“SqlAttributesFilter” に変更します。

{
    "name": "LoginChain",
    "type": "Chain",
    "config": {
        "filters": ["SqlAttributesFilter","LoginRequestFilter" ],
        "handler": "ClientHandler"
    }
},

b. SqlAttributesFilter の追加
LoginChainとLoginRequestFilterの間に、SqlAttributesFilter の記述を追加します。
(FileAttributesFilter はそのまま記述していても影響ありません)
なお、dataSource のリソース名は、JNDI設定で指定した値と同じにしてください。

{
    "name": "SqlAttributesFilter",
    "type": "SqlAttributesFilter",
    "config": {
        "target":"${exchange.credentials}",
        "dataSource": "java:comp/env/jdbc/forgerock",
        "preparedStatement":"SELECT username, password FROM users WHERE email = ?;",
        "parameters": ["foo@example.com"]
    }
},

これで config.json の変更は完了です。

参考までに、簡易認証アプリ用のconfig.jsonを全文掲載しておきます。

{
    "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": ["SqlAttributesFilter","LoginRequestFilter" ],
                    "handler": "ClientHandler"
                }
            },
            {
                "name": "SqlAttributesFilter",
                "type": "SqlAttributesFilter",
                "config": {
                      "target":"${exchange.credentials}",
                      "dataSource": "java:comp/env/jdbc/forgerock",
                      "preparedStatement":"SELECT username, password FROM users WHERE email = ?;",
                      "parameters": ["foo@example.com"]
                }
            },
            {
                "name": "LoginRequestFilter",
                "type": "StaticRequestFilter",
                "config": {
                    "method": "POST",
                    "uri": "http://192.168.0.10:80/sample/login.php",
                    "form": {
                        "userid": ["${exchange.credentials.username}"],
                        "password": ["${exchange.credentials.password}"],
                        "action": ["login"]
                    }
                }
            }, 
            {
                "name": "ClientHandler",
                "type": "ClientHandler",
                "config": {
                }
            }
        ]
    },
    "servletObject": "HandlerServlet",
}

4. 動作テスト

コンフィグファイルを変更したので、OpenIGが稼働するWebアプリケーションコンテナを再起動します。
Webブラウザでターゲットアプリケーションを閲覧し、自動でログインできていることを確認しましょう。

もしもログインできない場合、config.json ファイルの記述、データベース接続設定などを見直してみてください。
また、第4回でご紹介したキャプチャーログを取得してみると、アカウント情報が正常にPOSTされているかどうかが一目でわかります。

さて、うまくいきましたでしょうか?
アカウント情報を外部ファイルから取得する動作が確認できました。

次回からは、より実践的な内容です。
OpenAMとOpenIGとの連携方法について学びます。


(参考サイト)

ForgeRock社のドキュメントを参考にさせていただきました。

OpenIG自習室(第5回:代理認証 Lv.2)

takaです。

第3回ではOpenIGによる簡単な代理認証を行いました。

第3回の設定では、config.json ファイルの中にユーザー名とパスワードを直接記述しています。
そのようなやり方は実際の運用環境に即していませんので、もう少し本番に近い形で設定を行ってみます。

今回は、テキストファイルに記述されたアカウント情報を取得して認証を行います。
テキストファイルを使うことはまれだと思いますが、データベースを使うほどではない環境の場合には参考になるかもしれません。

検証作業は、以下の環境で実施しています。

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社が提供するサンプルのコンフィグファイルuserfile というファイルが含まれています。
テキストエディタで開くと、1行目にはフィールド名、2行目と3行目にユーザーデータが記述されています。
1行目には「username,password,fullname,email」とありますので、左からユーザー名(ID)、パスワード、フルネーム、Eメールアドレスということになります。

このファイルに、簡易認証アプリ(またはWordPress)のアカウントを追加します。

foo,bar,Foo Bar,foo@example.com

ファイルを保存して、OpenIGサーバの /tmp ディレクトリに設置します。

2. config.json ファイルの変更

ForgeRock社が提供するサンプルのコンフィグファイルに含まれる WordPressLoginFile.json を参考に、ファイルを修正します。

【WordPress】
WordPressを使っている場合は、ご利用環境に合わせて WordPressLoginFile.json の以下の箇所を修正してください。

9行 :baseURI のURL
18行:condition のパス
42行:value のEメールアドレス
51行:uri のURL
56行:redirect_to のURL

【簡易認証アプリ】
簡易認証アプリケーションを使う方は、第3回で使った config.json を以下のようにカスタマイズします。

a. LoginChain の変更
LoginChain の “filters” に “FileAttributesFilter” を追加します。

{
    "name": "LoginChain",
    "type": "Chain",
    "config": {
        "filters": ["FileAttributesFilter","LoginRequestFilter" ],
        "handler": "ClientHandler"
    }
},

b. FileAttributesFilter の追加
LoginChainとLoginRequestFilterの間に、FileAttributesFilter の記述を追加します。

{
    "name": "FileAttributesFilter",
    "type": "FileAttributesFilter",
    "config": {
        "target":"${exchange.credentials}",
        "file": "/tmp/userfile",
        "key": "email",
        "value": "foo@example.com",
        "fields": ["username","password","fullname","email"]
    }
},

c. LoginRequestFilter の変更
固定値で記述されている useridpassword の値を、テキストファイルから取得した値となるよう変更します。

{
    "name": "LoginRequestFilter",
    "type": "StaticRequestFilter",
    "config": {
        "method": "POST",
        "uri": "http://192.168.0.10:80/sample/login.php",
        "form": {
            "userid": ["${exchange.credentials.username}"],
            "password": ["${exchange.credentials.password}"],
            "action": ["login"]
        }
    }
}, 

これで config.json の変更は完了です。

参考までに、簡易認証アプリ用のconfig.jsonを全文掲載しておきます。

{
    "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": ["FileAttributesFilter","LoginRequestFilter" ],
                    "handler": "ClientHandler"
                }
            },
            {
                "name": "FileAttributesFilter",
                "type": "FileAttributesFilter",
                "config": {
                      "target":"${exchange.credentials}",
                      "file": "/tmp/userfile",
                       "key": "email",
                       "value": "foo@example.com",
                       "fields": ["username","password","fullname","email"]
                }
            },
            {
                "name": "LoginRequestFilter",
                "type": "StaticRequestFilter",
                "config": {
                    "method": "POST",
                    "uri": "http://192.168.0.10:80/sample/login.php",
                    "form": {
                        "userid": ["${exchange.credentials.username}"],
                        "password": ["${exchange.credentials.password}"],
                        "action": ["login"]
                    }
                }
            }, 
            {
                "name": "ClientHandler",
                "type": "ClientHandler",
                "config": {
                }
            }
        ]
    },
    "servletObject": "HandlerServlet",
}

3. 動作テスト

コンフィグファイルを変更したので、OpenIGが稼働するWebアプリケーションコンテナを再起動します。
Webブラウザでターゲットアプリケーションを閲覧し、自動でログインできていることを確認しましょう。

もしもログインできない場合、config.json ファイルや userfile の記述を見直してみてください。
また、第4回でご紹介したキャプチャーログを取得してみると、アカウント情報が正常にPOSTされているかどうかが一目でわかります。

さて、うまくいきましたでしょうか?
キーとなる値は固定値ですが、アカウント情報を外部ファイルから取得する動作が確認できました。

次回は、アカウント情報をデータベースから取得してみます。


(参考サイト)

ForgeRock社のドキュメントを参考にさせていただきました。