[CentOS6][OpenAM10] OpenAMを試す - テスト用WEBサイトを用意する


Create: 2014/02/10
LastUpdate: 2014/02/22
≪ メニューに戻る

ここでは、OpenAMのテスト環境を構築したときの手順の一部を紹介します。
テスト環境の概要は、メニューを参照してください。
SSOを試すには、認証で保護するWEBサイトが必要になります。そこで、まず最初に、「テスト用WEBサイト」を構築します。
今回、テスト用に用意するのは、以下の3つのページです。
  • ログインページからフォーム認証でログインするページ
  • Basic認証でログインするページ
  • 認証なしで誰でも参照できるページ
また、SSOのテスト用にユーザ端末も用意しました。
システム構成のイメージは以下のとおり。
「ユーザ端末」はWindows8+IE11、「テスト用のWEBサイト」はCentOS6+Apache2+PHP5とします。


ユーザ端末:192.168.1.91
WEBサーバ:192.168.1.94
環境構築と動作確認の手順は、以下のとおり。
  1. WEBサーバの構築(CentOS6 + Apache + php)
  2. ユーザ端末の構築(Windows8)
  3. 動作確認

1.WEBサーバの構築


CentOS6 + Apache + PHP5の組み合わせでWEBサーバを構築します。

1.1.CentOS6のインストール


CentOS6のインストール手順は、「 [XenServer 6.1.0] CentOS6.4(32bit)のネットワーク・インストール」を参照してください。
今回は、以下のような設定にします。
  • OS:CentOS6.4 (32bit)
  • SELinux:無効
  • ファイヤーウォール:無効
  • タイムゾーン:Asia/Tokyo
  • 言語:ja_JP.UTF-8
  • パッケージ:最小構成
  • ホスト名: exweb01
  • IPアドレス: 192.168.1.94

1.2.Apache + PHP5のインストール


yum でApacheとPHPをインストールします。
# yum install httpd php
PHPアプリケーション実行時に警告メッセージが出力されるので、PHPのタイムゾーン設定だけ変更します。
/etc/php.ini 以下のように修正します。(赤字部分)
;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;

[Date]
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "Asia/Tokyo"
BASIC認証が使用できるようにApacheの設定を変更します。また、Apache起動時に警告メッセージが出力されるのでServerName も設定します。
/etc/httpd/conf/httpd.conf を以下のように修正します。(赤字部分)
#ServerName www.example.com:80
ServerName 127.0.0.1:80
~省略~
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
#   Options FileInfo AuthConfig Limit
#
    #AllowOverride None
    AllowOverride All
以下のようにして、Apacheのサービスを自動起動/停止するように設定して起動します。
# chkconfig httpd on
# service httpd start

1.3.WEBページの作成


/var/www/html に以下の構成でWEBページを作成します。
/var/www/html              : ドキュメントルート
├── demo1                  : BASIC認証ページ
│   ├── .htaccess
│   └── index.html
├── demo2                  : フォーム認証ページ
│   ├── index.html
│   ├── logon.php
│   ├── logout.php
│   └── main.php
└── index.html             : 認証なしページ(TOPページ)

(1) 認証なしページ(TOPページ)
「BASIC認証ページ」と「フォーム認証ページ」へのリンクを持つだけのページを作成します。このページは誰でも表示できるページとして作成します。
/var/www/html/index.html の内容は以下のとおり。
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>DEMO TOP</title>
  </head>
  <body>
    <h1>DEMO TOP</h1>
    <ul>
    <li><a href="demo1/">BASIC認証ページ</a>
    <li><a href="demo2/">フォーム認証ページ</a>
    </ul>
  </body>
</html>

(2) BASIC認証ページ
BASIC認証用のユーザ/パスワードを入力しないと見れないページを作成します。
まず、表示するページを作成します。
/var/www/html/demo1/index.html の内容は以下のとおり。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>DEMO1 PAGE</title>
</head>
<body>
<h1>DEMO1 PAGE</h1>
<p>BASIC認証で保護されたページです。</p>
</body>
</html>
次に、/var/www/html/demo1内のページは、BASIC認証を有効にします。
/var/www/html/demo1/.htaccess に設定を記述します。内容は以下のとおり。
AuthType Basic
AuthName "Input your ID and Password."
AuthUserFile /etc/httpd/conf/htpasswd
require valid-user
最後に、htpasswd コマンドで BASIC認証用のアカウントを作成します。
アカウントは、/etc/httpd/conf/htpasswd に保存します。
# htpasswd -c /etc/httpd/conf/htpasswd user01
New password: パスワード
Re-type new password: パスワード
Adding password for user user01

(3) フォーム認証ページ
ログイン画面でユーザ/パスワードを入力しないと見れないページを作成します。
/var/www/html/demo2/logon.phpでログイン画面を表示して認証処理を実施します。
内容は以下のとおり。
ユーザ/パスワードはソースにハードコーディングして、1アカウント(user01/password)だけOKにするようにしています。
<?php
$TEST_USER = "user01";
$TEST_PASS = "password";
session_start();

// エラーメッセージ
$errorMessage = "";

// 画面に表示するため特殊文字をエスケープする
$viewUserId = htmlspecialchars($_POST["userid"], ENT_QUOTES);

// ログインボタンが押された場合
if (isset($_POST["login"])) {
  // 認証成功
  if ($_POST["id"] == $TEST_USER  && $_POST["pwd"] == $TEST_PASS) {
    // セッションIDを新規に発行する
    session_regenerate_id(TRUE);
    $_SESSION["USERID"] = $_POST["id"];
    header("Location: main.php");
    exit;
  }
  else {
    $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。";
  }
}
else {
    $errorMessage = "ログインボタンをクリックしてください。";
}
?>

<!doctype html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>DEMO2 PAGE - logon</title>
  </head>
  <body>
  <h1>DEMO2 PAGE - logon </h1>
  <form id="loginForm" name="loginForm" action="<?php print($_SERVER['PHP_SELF']) ?>" method="POST">
  <fieldset style="width:400px">
  <legend>フォーム認証</legend>
  <div style="color:red"><?php echo $errorMessage ?></div>
  <label for="userid">ユーザID</label><input type="text" id="id" name="id" value="<?php echo $viewUserId ?>">
  <br>
  <label for="password">パスワード</label><input type="password" id="pwd" name="pwd" value="">
  <br>
  <label></label><input type="submit" id="login" name="login" value="ログイン">
  </fieldset>
  </form>
  </body>
</html>
/var/www/html/demo2/main.phpでログイン成功後の画面を表示します。
セッションがタイムアウトしたり、ログインしていないユーザが表示しようとした場合などは、ログアウトページに飛ばします。
内容は以下のとおり。
<?php
session_start();

// ログイン状態のチェック
if (!isset($_SESSION["USERID"])) {
  header("Location: logout.php");
  exit;
}

$msg = "ようこそ" . $_SESSION["USERID"] . "さん";
?>

<!doctype html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>DEMO2 PAGE - main</title>
  </head>
  <body>
  <h1>DEMO2 PAGE - main</h1>
  <p><?php echo $msg ?></p>
  <ul>
  <li><a href="logout.php">ログアウト</a></li>
  </ul>
  </body>
</html>
/var/www/html/demo2/logout.phpでログアウト後の画面を表示します。
内容は以下のとおり。
<?php
session_start();

if (isset($_SESSION["USERID"])) {
  $errorMessage = "ログアウトしました。";
}
else {
  $errorMessage = "セッションがタイムアウトしました。";
}

// セッション変数のクリア
$_SESSION = array();

// クッキーの破棄
if (ini_get("session.use_cookies")) {
  $params = session_get_cookie_params();
  setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
            );
}

// セッションクリア
@session_destroy();
?>

<!doctype html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>DEMO2 PAGE - logout</title>
  </head>
  <body>
  <h1>DEMO2 PAGE - logout</h1>
  <div style="color:red"><?php echo $errorMessage; ?></div>
  <ul>
  <li><a href="logon.php">ログイン画面に戻る</a></li>
  </ul>
  </body>
</html>

2.ユーザ端末の構築


ユーザー端末には、Windows8 を使用します。インストール手順については、「 [XenServer 6.1.0] Windows8(32bit)(評価版)のインストール」を参照してください。
OSの設定は以下のようにします。
  • OS:Windows8 (32bit)
  • ホスト名: exdt01
  • IPアドレス: 192.168.1.91
作業しやすいようにリモートデスクトップを許可します。
「コントロールパネル」→「システムとセキュリティ」→「リモートアクセスの許可」 で下図の画面を表示したら、赤枠で示した箇所をチェックして[OK]ボタンをクリックします。



OpenAMでSSOする場合、ブラウザは、クッキーとJavascriptが扱えるなら何でもよさそうなのですが、今回はIEを使用します。
なお、OpenAMではCookie に認証情報を保存するのでFQDNでWEBサイトにアクセスできたほうがいいようです。
今回は、DNSサーバを用意していないので hosts にWEBサーバのIPアドレスとFQDNを登録します。
http://www.example.com でアクセスできるように、上記1のWEBサーバのIPアドレスを登録します。
管理者モードでエディタ(メモ帳など)を起動して、C:\windows\system32\drivers\etc\hosts に以下の内容を追記します。
192.168.1.94    www.example.com
ここでは、SSO用の特別な設定は行いませんが、WindowsDesktopSSO認証を試したいと思っているのでユーザ端末を用意しました。
WindowsDesktopSSO認証でSSOを行うと、Windows端末にログインするだけで、上記のWEBサイトをログイン不要で使用できるようになります。

3.動作確認


ユーザ端末から上記1の「テスト用WEBサイト」にアクセスして動作を確認します。
ユーザ端末にログインして、以下のURLにアクセスします。
  • http://www.example.com
下図のページが表示されたらOKです。
[BASIC認証ページ]をクリックします。



下図のページが表示されたらOKです。
BASIC認証用のユーザとパスワードを入力して、[OK]ボタンをクリックします。



下図のページが表示されたらOKです。
ブラウザの[戻る]ボタンをクリックします。



下図のトップページが表示されたら、[フォーム認証ページ]をクリックします。



下図のページが表示されたら、OKです。
ユーザに "user01"、パスワードに “password" を入力して、[ログイン]ボタンをクリックします。



下図のページが表示されたらOKです。
[ログアウト]ボタンをクリックします。



下図のページが表示されたらOKです。