[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[upki-fed:00608] NetCommonsのシボレス化



UPKI-FEDのみなさま

 いつもお世話になっております。
 都医学研の赤沢です。

 テストフェデレーションに参加中で、テスト用IdPとテスト用SPを
 構築し、両者間の連携(※)もうまくいきました。

  ★学認サイトの「1.SPにテスト用のWebページを準備」に
   従って、「属性確認用の簡単なPHPプログラム」を利用
   させていただきました。
   https://www.gakunin.jp/docs/fed/technical/sp/customize/sp-test2

 ここで、NetCommonsをシボレス化しようとしているのですが、
 うまくいっておりません。たびたびで恐縮ですがお知恵を拝借
 できますでしょうか。

  ※ご存じの方も多いかと思いますが、NetCommonsはオープンソースの
   CMS兼グループウェアです。
   http://www.netcommons.org/

[1] 当方の環境

 (1) テスト用IdP(以下、IdPといいます)
    OS: CentOS 5.5
    Apache: 2.2.3
    PHP: 5.2.10
    jdk-6u37-linux-i586-rpm.bin
    tomcat 6
    shibboleth-identityprovider-2.3.8
  ※学認サイトの「技術ガイド」に従って構築しました。

 (2) テスト用SP(以下、SPといいます)兼NetCommonsサーバ
    OS: CentOS 5.9
    Apache: 2.2.3
    PHP: 5.3.3
    PHP PEAR: 1.4.9
    MySQL: 5.0.95
    NetCommons: 2.4.0.0
    Shibboleth: 2.5.1
  ※SPは学認サイトの「技術ガイド」に従って構築しました。

 蛇足ですが、両サーバともこの連休中はシャットダウンして
 あります。この週末停電があるためです。


[2] NetCommons

 https://sptest.igakuken.or.jp/htdocs/ にてアクセスできる
 ようにしてあります。NetCommonsのローカルユーザを作成し
 ローカル認証でログインできることも確認済みです。

 また、このローカルユーザは 当方のLDAPにも登録済みです。
 LDAP と NetCommonsで二重のユーザ管理となりますが、
 ここは妥協しています。

 クッキー名は session_cookie となるようにNetCommonsを
 設定済みです。

[3] SPのシボレス化の方式

 https://www.gakunin.jp/docs/fed/technical/sp/WebApp
 ↑の「2.既存のアプリケーションのユーザ管理へのProxyを用意する」
 に従いました。

  ※「3. Shibbolethのセッションをもとにユーザ管理を行う」を
   最初に試しましたが、これはうまくいきませんでした。
   詳しくはNetCommons2公式サイトに書いておきました(ご参考)。
   http://www.netcommons.org/bb7war9c0-4093/#_4093
   この方法は興味があったので試したのですが、本採用するには
   問題がありました。例えば、NetCommonsのユーザ権限や所属ルーム
   を当方のLDAPで新たに管理する必要があるといったことで、
   導入負荷が高すぎると考えています。


[4] ログインProxy

 ログインProxy用プログラムを /login/index.php として用意しました。
 index.php としては、学認サイトの次のページに記載の「PHPのサンプル」
 を利用しました。
 https://www.gakunin.jp/docs/fed/technical/sp/WebApp/pattern2

 ただし、次の箇所は当方の環境に合わせて変更しました。
 (変更後のものをお示しします)

<?php
 (中略)
  $http =& new HTTP_Request("https://sptest.igakuken.or.jp/login");
  $http->setMethod(HTTP_REQUEST_METHOD_POST);
  $http->addPostData("login_id", "shibboleth_user");   ←☆1
  $http->addPostData("password", "shibboleth_password"); ←☆2
  $app_response = $http->sendRequest();
  $app_cookies = $http->getResponseCookies();

  // 取得されたアプリケーションのセッションCookieをレスポンスに設定する
  setcookie('session_cookie', $app_cookies["session_cookie"], 0, "/",
"sptest.igakuken.or.jp");

  // ログイン後のトップページへリダイレクトする
  header("HTTP/1.1 302 Found");
  header("Location: https://sptest.igakuken.or.jp/htdocs");
?>

  ☆1 NetCommonsのオリジナルのログイン画面で、ユーザ名の
     <input>タグでは 属性name="login_id" となっています。
  ☆2 同じく、パスワード入力用の <input>タグでは 属性
     name="password" となっています。


[5] SPの設定

 /etc/httpd/conf.d/shib.conf に次の設定を追加しました。
-----------------------------------------
<Location /login>
  AuthType shibboleth
  ShibRequestSetting requireSession true
  require valid-user
</Location>

<Location /htdocs>
  AuthType shibboleth
  ShibRequestSetting requireSession true
  require valid-user
</Location>
-----------------------------------------

 続いて、
 service shibd restart
 service httpd restart
 を実行しました。

[6] うまくいく点

 https://sptest.igakuken.or.jp/login/ にアクセスすると
 学認のDSにリダイレクトされ、当方のIdPを選択後、当方のIdPに
 リダイレクトされます。ユーザ名とパスワードを入力すると
 https://sptest.igakuken.or.jp/login/ に戻ってきます。

[7] うまくいかない点、試した事など

 [6]の結果、真っ白画面になってしまいました。

 まず、ログインproxy用プログラム(以下、proxyプログラム)中で
 $_ENV が使われていますが、これは空の配列であることがわかりました。

 仕方ないので $_ENVの代わりに $_SERVER に置き換えました。
 $_SERVER['eduPersonTargetedID'] というものも返って来ない(NULL)の
 ため、$_SERVER['eppn'] としてみました。
 このあたりの改造は、本メール冒頭の★印のプログラムを参考に
 させていただきました。

 IdP認証後にSPの/login/に戻ってきた際に、NetCommons側(/htdocs/)
 にリダイレクトされてしまうと、原因調査ができません。そこで以後は
 次のようにリダイレクトさせている箇所はコメントアウトしました。
  // ログイン後のトップページへリダイレクトする
 //header("HTTP/1.1 302 Found");
  //header("Location: https://sptest.igakuken.or.jp/htdocs");
 ?>

 動作確認には、Firefox 18.02 とFirebug を使っているのですが、
 session_cookie が deleted になってしまっていることがわかりました。
  $app_cookies = $http->getResponseCookies();
 に失敗している様子です。

 [4]の☆1と☆2の各第2引数は、NetCommons用の正しいユーザ名と
 パスワードにしなくてはならないのかなと考え、実際に即値で
 記述して動作を確認してみました。例えば、ユーザ名が igakuserで
 パスワードが igakpass ならば、次のように書き換えました。

  $http->addPostData("login_id", "igakuser"); ←☆1
  $http->addPostData("password", "igakpass"); ←☆2

 しかし、これでもsession_cookie が deleted になってしまって
 います。

  $http =& new HTTP_Request("https://sptest.igakuken.or.jp/login");
 としているところのパス部分(末尾)を次のように変えてみました。
  $http =& new HTTP_Request("https://sptest.igakuken.or.jp/htdocs");

 これで試してみても同様にsession_cookie が deleted になって
 しまってます。

 もちろん、何かやり直すたびに、Firefoxを再起動させてから試して
 います。

 session_cookieさえちゃんと取得できるようになれば、認証はうまく
 いくような気がするのですが、いかがでしょう。

 長くなって申し訳ありませんが、どうかご教授の程よろしくお願い
 致します。

--
赤沢年一
(公財)東京都医学総合研究所 情報システム室